/* ==========================================================================
   site.css — extracted from index.html
   Order matters: the head stylesheet first, then the five blocks that were
   previously inline in <body>, in their original DOM order.
   ========================================================================== */
        /* ============================================================
           DESIGN TOKENS
        ============================================================ */
        :root {
            /* Surfaces — warm charcoal, lifted off pure black for more light */
            --bg:           #121009;
            --bg-2:         #1a160c;
            --bg-3:         #241d10;
            --bg-card:      #221c0e;
            --bg-card-hover:#2c2412;
            --border:       rgba(244, 196, 48, 0.13);
            --border-strong:rgba(244, 196, 48, 0.26);

            /* Kente palette (gold / green / red).
               --green and --red are brand accents for borders, fills and glows.
               Set as small text on these dark surfaces they land at 3.9–4.8:1,
               so text uses the -text variants below instead. */
            --gold:    #f4c430;
            --gold-dim:rgba(244, 196, 48, 0.18);
            --green:   #1f9249;
            --green-text: #3fbf6e;   /* 6.5:1 on the lightest card surface */
            --green-dim:rgba(31, 146, 73, 0.18);
            --red:     #d4324b;
            --red-text: #f4697f;     /* 5.2:1 on the lightest card surface */
            --red-dim: rgba(212, 50, 75, 0.17);

            /* Type — every value below clears WCAG AA (4.5:1) against every
               surface it is used on, including --bg-card-hover. */
            --ink:     #f5edd8;
            --ink-2:   #d8c98c;
            --ink-3:   #ab9059;
            --ink-4:   #ad8e52;

            /* Effects */
            --glow-gold:  0 6px 32px rgba(244, 196, 48, 0.35);
            --glow-green: 0 6px 32px rgba(26, 128, 64, 0.32);
            --kente: repeating-linear-gradient(90deg,
                #f4c430 0 8px, #0a0802 8px 13px,
                #1f9249 13px 21px, #0a0802 21px 26px,
                #d4324b 26px 34px, #0a0802 34px 39px,
                #f4c430 39px 47px, #0a0802 47px 52px,
                #1f9249 52px 60px);

            /* Near-opaque panel surface (mobile nav drawer). Themed, because a
               hard-coded dark value left the open drawer black-on-black in
               light mode. */
            --surface-solid: rgba(10, 8, 2, 0.97);
            /* Tinted pill/chip background sitting directly on the page. Only
               for surfaces whose TEXT is themed — scrims laid over photographs
               or dimming the page behind a modal stay dark literals, because
               they are meant to be dark in both themes. */
            --scrim: rgba(10, 8, 2, 0.55);
            --nav-bg:        rgba(10, 8, 2, 0.78);
            --nav-bg-strong: rgba(10, 8, 2, 0.92);

            /* Fonts */
            --font-display: 'Fraunces', 'Georgia', 'Times New Roman', serif;
            --font-body:    'Inter', 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
            --font-mono:    'JetBrains Mono', 'Fira Code', 'Courier New', monospace;

            /* Scale */
            --nav-h: 64px;
            --container: 1180px;
            --radius: 14px;
            --radius-sm: 8px;
        }

        /* ============================================================
           LIGHT MODE OVERRIDES
        ============================================================ */
        html[data-theme="light"] {
            --bg:            #f7f4ea;
            --bg-2:          #ede8d4;
            --bg-3:          #e1dac4;
            --bg-card:       #ffffff;
            --bg-card-hover: #fffaed;
            --border:        rgba(164, 130, 58, 0.18);
            --border-strong: rgba(164, 130, 58, 0.38);

            /* --gold doubles as the global link colour, so it has to clear
               4.5:1 on the page background, not just look gold. */
            --gold:      #7d5800;
            --gold-dim:  rgba(154, 110, 0, 0.10);
            --green:     #0f6a2e;
            --green-text: #0f6a2e;   /* already 4.8:1+ in light mode */
            --green-dim: rgba(15, 106, 46, 0.10);
            --red:       #a01a30;
            --red-text:  #a01a30;    /* already 5.6:1+ in light mode */
            --red-dim:   rgba(160, 26, 48, 0.10);

            --ink:   #1a1408;
            --ink-2: #3a2c0e;
            --ink-3: #71571f;
            --ink-4: #6f5420;

            --glow-gold:  0 4px 20px rgba(154, 110, 0, 0.14);
            --glow-green: 0 4px 20px rgba(15, 106, 46, 0.12);

            --kente: repeating-linear-gradient(90deg,
                #9a6e00 0 8px,  #e1dac4 8px 13px,
                #0f6a2e 13px 21px, #e1dac4 21px 26px,
                #a01a30 26px 34px, #e1dac4 34px 39px,
                #9a6e00 39px 47px, #e1dac4 47px 52px,
                #0f6a2e 52px 60px);

            /* Panel surfaces that must flip with the theme. Roughly thirty
               rgba(10,8,2,α) literals were scattered through this file as panel
               backgrounds; exactly one had a light-mode override, so the rest
               stayed near-black in light mode while their text went near-black
               too. Scrims that deliberately sit OVER imagery or dim the page
               behind a modal are left as literals — they should stay dark. */
            --surface-solid: rgba(247, 244, 234, 0.97);
            --scrim: rgba(225, 218, 196, 0.62);
            --nav-bg:        rgba(247, 244, 234, 0.92);
            --nav-bg-strong: rgba(247, 244, 234, 0.97);
        }

        /* ---- Light by default when the OS asks for it -------------------
           The tokens above only apply once something sets data-theme, and the
           only thing that does is an inline script. If that script is blocked,
           throws, or never runs, :root's dark palette wins and a light-mode
           visitor gets a dark site — permanently, not just for a frame.

           This block covers that: it matches only while data-theme is ABSENT,
           so an explicit choice by the user still beats it, and it needs no
           JavaScript at all.

           Values MUST track html[data-theme="light"] above, which stays the
           source of truth. Nothing else may be added here. ------------------- */
        @media (prefers-color-scheme: light) {
            html:not([data-theme]) {
                --bg:            #f7f4ea;
                --bg-2:          #ede8d4;
                --bg-3:          #e1dac4;
                --bg-card:       #ffffff;
                --bg-card-hover: #fffaed;
                --border:        rgba(164, 130, 58, 0.18);
                --border-strong: rgba(164, 130, 58, 0.38);

                --gold:      #7d5800;
                --gold-dim:  rgba(154, 110, 0, 0.10);
                --green:     #0f6a2e;
                --green-text: #0f6a2e;
                --green-dim: rgba(15, 106, 46, 0.10);
                --red:       #a01a30;
                --red-text:  #a01a30;
                --red-dim:   rgba(160, 26, 48, 0.10);

                --ink:   #1a1408;
                --ink-2: #3a2c0e;
                --ink-3: #71571f;
                --ink-4: #6f5420;

                --glow-gold:  0 4px 20px rgba(154, 110, 0, 0.14);
                --glow-green: 0 4px 20px rgba(15, 106, 46, 0.12);

                --kente: repeating-linear-gradient(90deg,
                    #9a6e00 0 8px,  #e1dac4 8px 13px,
                    #0f6a2e 13px 21px, #e1dac4 21px 26px,
                    #a01a30 26px 34px, #e1dac4 34px 39px,
                    #9a6e00 39px 47px, #e1dac4 47px 52px,
                    #0f6a2e 52px 60px);

                --surface-solid: rgba(247, 244, 234, 0.97);
            --scrim: rgba(225, 218, 196, 0.62);
            --nav-bg:        rgba(247, 244, 234, 0.92);
            --nav-bg-strong: rgba(247, 244, 234, 0.97);
            }
        }

        /* .nav's own background now comes from --nav-bg / --nav-bg-strong,
           declared with the rest of the tokens. */
        .nav.scrolled { background: var(--nav-bg-strong); }

        html[data-theme="light"] body::after {
            background:
                radial-gradient(62% 52% at 16% 10%, rgba(154, 110, 0, 0.06), transparent 70%),
                radial-gradient(55% 48% at 86% 20%, rgba(15, 106, 46, 0.04), transparent 72%),
                radial-gradient(75% 60% at 50% 112%, rgba(160, 26, 48, 0.04), transparent 70%);
        }

        html[data-theme="light"] body::before {
            opacity: 0.018;
            mix-blend-mode: multiply;
        }

        html[data-theme="light"] ::selection { background: #9a6e00; color: #fff; }

        html[data-theme="light"] a:hover { color: #6e4e00; }

        html[data-theme="light"] .cursor-glow {
            background: radial-gradient(420px circle at var(--cx, -999px) var(--cy, -999px),
                rgba(154, 110, 0, 0.06), transparent 60%);
        }

        html[data-theme="light"] .to-top:hover { background: #6e4e00; color: #fff; }

        html[data-theme="light"] .nav-cmdk kbd {
            background: rgba(164, 130, 58, 0.10);
        }

        /* Theme toggle button */
        .nav-theme-toggle {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 40px;
            height: 40px;
            border-radius: 8px;
            border: 1px solid var(--border-strong);
            background: transparent;
            color: var(--ink-3);
            position: relative;
            cursor: pointer;
            transition: color .2s ease, border-color .2s ease, background .2s ease;
            flex-shrink: 0;
        }
        .nav-theme-toggle:hover { color: var(--gold); border-color: var(--gold); background: var(--gold-dim); }
        .nav-theme-toggle .theme-icon-sun  { display: block; }
        .nav-theme-toggle .theme-icon-moon { display: none; }
        html[data-theme="light"] .nav-theme-toggle .theme-icon-sun  { display: none; }
        html[data-theme="light"] .nav-theme-toggle .theme-icon-moon { display: block; }

        /* Smooth theme transitions (applied after page load via JS) */
        html.theme-ready body,
        html.theme-ready .nav,
        html.theme-ready .bg-card,
        html.theme-ready section { transition: background-color 0.25s ease, color 0.25s ease, border-color 0.25s ease; }

        /* ============================================================
           RESET & BASE
        ============================================================ */
        *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }

        html {
            scroll-behavior: smooth;
            scroll-padding-top: 80px;
            background: var(--bg);
            overflow-x: hidden;
        }

        body {
            font-family: var(--font-body);
            background: var(--bg);
            color: var(--ink);
            line-height: 1.65;
            overflow-x: hidden;
            -webkit-font-smoothing: antialiased;
            -moz-osx-font-smoothing: grayscale;
            text-rendering: optimizeLegibility;
            font-feature-settings: 'kern', 'liga', 'calt', 'ss01';
        }

        ::selection { background: var(--gold); color: var(--bg); }

        /* Keyboard accessibility — visible focus ring */
        :focus-visible { outline: 2px solid var(--gold); outline-offset: 3px; border-radius: 4px; }
        a:focus:not(:focus-visible), button:focus:not(:focus-visible) { outline: none; }

        a { color: var(--gold); text-decoration: none; transition: color .2s ease; }
        a:hover { color: #fff8d6; }

        img { max-width: 100%; display: block; }

        button { font: inherit; cursor: pointer; }

        /* Ambient noise grain — adds depth without overwhelming */
        body::before {
            content: '';
            position: fixed;
            inset: 0;
            pointer-events: none;
            z-index: 2;
            opacity: 0.035;
            mix-blend-mode: overlay;
            background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.96  0 0 0 0 0.85  0 0 0 0 0.52  0 0 0 1 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
        }

        /* Ambient warm light wash — soft Kente-tinted glows that add
           color and luminosity behind the content without washing it out */
        body::after {
            content: '';
            position: fixed;
            inset: 0;
            pointer-events: none;
            z-index: 0;
            background:
                radial-gradient(62% 52% at 16% 10%, rgba(244, 196, 48, 0.07), transparent 70%),
                radial-gradient(55% 48% at 86% 20%, rgba(31, 146, 73, 0.055), transparent 72%),
                radial-gradient(75% 60% at 50% 112%, rgba(212, 50, 75, 0.05), transparent 70%);
        }

        /* Ambient microbiology layer — viewport-fixed for performance.
           Opacity is updated from JS based on scroll so the hero
           doesn't fight with the hero canvas. */
        .ambient-canvas {
            position: fixed;
            top: 0; left: 0;
            width: 100%;
            height: 100vh;
            pointer-events: none;
            z-index: 0;
            opacity: 0;
            transition: opacity .4s ease;
        }
        body > main, body > section, body > footer, body > .section, body > nav { position: relative; z-index: 1; }
        @media (hover: none) and (pointer: coarse) {
            /* Disable the heavy ambient layer on touch devices */
            .ambient-canvas { display: none; }
        }

        /* Cultural background canvas — Japan (left) + Ghana (right) */
        .cultural-bg-canvas {
            position: fixed;
            top: 0; left: 0;
            width: 100%; height: 100vh;
            pointer-events: none;
            z-index: 0;
            /* sits at same level as ambient canvas; cultural canvas is earlier
               in DOM so ambient noise texture (0.035 opacity) renders on top */
        }
        @media (prefers-reduced-motion: reduce) {
            .cultural-bg-canvas { display: none; }
        }


        /* ---- Accessibility helpers ---- */
        .skip-link {
            position: absolute;
            left: 1rem;
            top: -3rem;
            z-index: 2000;
            padding: .7rem 1.15rem;
            background: var(--gold);
            /* var(--bg), not a fixed ink: --gold is DARK in light mode (#7d5800), so
               hard-coded dark text on it measured ~2.9:1. This flips with the theme. */
            color: var(--bg);
            font-family: var(--font-mono);
            font-size: .82rem;
            font-weight: 700;
            border-radius: 0 0 10px 10px;
            text-decoration: none;
            transition: top .18s ease;
        }
        .skip-link:focus { top: 0; }

        /* Available to screen readers and keyboard users, invisible on screen. */
        .sr-only {
            position: absolute;
            width: 1px; height: 1px;
            padding: 0; margin: -1px;
            overflow: hidden;
            clip: rect(0, 0, 0, 0);
            white-space: nowrap;
            border: 0;
        }

        /* Grows the touch target of the small square icon buttons to 44px
           without changing how big they look. */
        .nav-theme-toggle::after {
            content: '';
            position: absolute;
            inset: -2px;
            min-width: 44px;
            min-height: 44px;
            left: 50%; top: 50%;
            transform: translate(-50%, -50%);
        }


        /* ============================================================
           TEACHING & MENTORING
        ============================================================ */
        .teach-grid {
            display: grid;
            grid-template-columns: 1.15fr 1fr;
            gap: 26px;
            align-items: start;
        }
        .teach-block {
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            padding: 24px 26px 22px;
        }
        .teach-heading {
            font-family: var(--font-mono);
            font-size: 0.72rem;
            letter-spacing: 0.12em;
            text-transform: uppercase;
            color: var(--gold);
            margin: 0 0 16px;
        }
        .teach-table-wrap { overflow-x: auto; }
        .teach-table { width: 100%; border-collapse: collapse; font-size: 0.86rem; }
        .teach-table th {
            text-align: left;
            font-family: var(--font-mono);
            font-size: 0.66rem;
            letter-spacing: 0.08em;
            text-transform: uppercase;
            color: var(--ink-3);
            font-weight: 600;
            padding: 0 12px 9px 0;
            border-bottom: 1px solid var(--border-strong);
            white-space: nowrap;
        }
        .teach-table td {
            padding: 9px 12px 9px 0;
            border-bottom: 1px solid var(--border);
            color: var(--ink-2);
            vertical-align: top;
        }
        .teach-table tbody tr:last-child td { border-bottom: none; }
        .teach-table td:nth-child(2) { font-family: var(--font-mono); color: var(--gold); white-space: nowrap; }
        .teach-table td:nth-child(3),
        .teach-table td:nth-child(4) { color: var(--ink-3); white-space: nowrap; font-size: 0.8rem; }
        /* On a phone the nowrap cells force the table wider than the viewport;
           let them wrap and lean on .teach-table-wrap's scroll for the rest. */
        @media (max-width: 600px) {
            .teach-table td:nth-child(2),
            .teach-table td:nth-child(3),
            .teach-table td:nth-child(4) { white-space: normal; }
        }

        .mentee-list { list-style: none; margin: 0; padding: 0; }
        .mentee-list li {
            display: grid;
            grid-template-columns: 1fr auto;
            gap: 2px 12px;
            padding: 10px 0;
            border-bottom: 1px solid var(--border);
        }
        .mentee-list li:last-child { border-bottom: none; }
        .mentee-name { font-weight: 600; color: var(--ink); font-size: 0.9rem; }
        .mentee-where {
            font-family: var(--font-mono); font-size: 0.66rem; color: var(--ink-3);
            align-self: center; white-space: nowrap;
        }
        .mentee-proj { grid-column: 1 / -1; font-size: 0.82rem; color: var(--ink-3); line-height: 1.45; }
        .teach-note {
            margin: 16px 0 0;
            font-size: 0.8rem;
            color: var(--ink-3);
            line-height: 1.6;
            padding-top: 14px;
            border-top: 1px solid var(--border);
        }

        /* ============================================================
           EDUCATION & SKILLS (in About)
        ============================================================ */
        .edu-list { list-style: none; margin: 0 0 4px; padding: 0; }
        .edu-list li { padding: 12px 0; border-bottom: 1px solid var(--border); }
        .edu-list li:last-child { border-bottom: none; }
        .edu-degree { font-weight: 600; color: var(--ink); font-size: 0.94rem; }
        .edu-meta {
            display: block; font-family: var(--font-mono); font-size: 0.7rem;
            color: var(--gold); margin: 3px 0 5px; letter-spacing: .03em;
        }
        .edu-detail { display: block; font-size: 0.83rem; color: var(--ink-3); line-height: 1.55; }
        .skills-groups { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 18px; }
        .skill-group h4 {
            font-family: var(--font-mono); font-size: 0.66rem; letter-spacing: .1em;
            text-transform: uppercase; color: var(--ink-3); margin: 0 0 9px; font-weight: 600;
        }
        .skill-chips { display: flex; flex-wrap: wrap; gap: 6px; }
        .skill-chips span {
            font-family: var(--font-mono); font-size: 0.7rem; color: var(--ink-2);
            background: var(--bg-2); border: 1px solid var(--border);
            border-radius: 50px; padding: 4px 10px; line-height: 1.5;
        }

        @media (max-width: 920px) {
            /* minmax(0,1fr): a bare 1fr track refuses to shrink below its
           min-content width, and the teaching table inside it propagated that
           width upward — the root cause of the whole page shearing off the
           right edge at 390 px, name included. */
        .teach-grid { grid-template-columns: minmax(0, 1fr); }
        }


        /* ============================================================
           NEWS STRIP
        ============================================================ */
        .news-strip {
            max-width: 1180px;
            margin: 0 auto;
            padding: 34px 24px 6px;
        }
        .news-heading {
            font-family: var(--font-mono);
            font-size: 0.72rem;
            letter-spacing: 0.14em;
            text-transform: uppercase;
            color: var(--gold);
            margin: 0 0 14px;
            display: flex;
            align-items: center;
            gap: 10px;
        }
        .news-heading::after {
            content: '';
            flex: 1;
            height: 1px;
            background: var(--border-strong);
        }
        .news-items { list-style: none; margin: 0; padding: 0; }
        .news-items li {
            display: grid;
            grid-template-columns: 92px 1fr;
            gap: 14px;
            padding: 9px 0;
            border-bottom: 1px solid var(--border);
            font-size: 0.88rem;
            line-height: 1.6;
            color: var(--ink-2);
        }
        .news-items li:last-child { border-bottom: none; }
        .news-items time {
            font-family: var(--font-mono);
            font-size: 0.72rem;
            color: var(--ink-3);
            padding-top: 3px;
            white-space: nowrap;
        }
        .news-items a { color: var(--gold); text-decoration: none; border-bottom: 1px solid var(--gold-dim); }
        .news-items a:hover { border-bottom-color: var(--gold); }
        @media (max-width: 600px) {
            .news-items li { grid-template-columns: 1fr; gap: 2px; }
            .news-items time { padding-top: 0; }
        }


        /* Block, not flex: flex would turn every inline <strong> into an item
           and space them apart with the gap. */
        .hero-availability {
            margin: 22px auto 0;
            font-size: 0.9rem;
            line-height: 1.75;
            color: var(--ink-2);
            max-width: 640px;
        }
        .hero-availability strong { color: var(--ink); font-weight: 600; }
        .hero-availability a { color: var(--gold); text-decoration: underline; text-underline-offset: 3px; }
        .hero-availability .open-pulse {
            display: inline-block;
            vertical-align: middle;
            margin-right: 7px;
            position: relative;
            top: -1px;
        }


        /* Pulls the Zenodo DOI up to where a 20-second visitor will see it. */
        .doi-banner {
            display: flex;
            align-items: flex-start;
            gap: 16px;
            max-width: 900px;
            margin: 0 auto 26px;
            padding: 16px 20px;
            background: var(--bg-card);
            border: 1px solid var(--border-strong);
            border-left: 3px solid var(--gold);
            border-radius: var(--radius-sm);
        }
        .doi-banner-badge {
            flex: none;
            font-family: var(--font-mono);
            font-size: 0.64rem;
            font-weight: 700;
            letter-spacing: 0.1em;
            /* var(--bg), not a fixed ink: --gold is DARK in light mode (#7d5800), so
               hard-coded dark text on it measured ~2.9:1. This flips with the theme. */
            color: var(--bg);
            background: var(--gold);
            border-radius: 4px;
            padding: 4px 8px;
            margin-top: 2px;
        }
        .doi-banner p { margin: 0; font-size: 0.87rem; line-height: 1.65; color: var(--ink-2); }
        .doi-banner strong { color: var(--ink); }
        .doi-banner a {
            font-family: var(--font-mono); font-size: 0.8rem; color: var(--gold);
            text-decoration: none; border-bottom: 1px solid var(--gold-dim); white-space: nowrap;
        }
        .doi-banner a:hover { border-bottom-color: var(--gold); }
        @media (max-width: 600px) { .doi-banner { flex-direction: column; gap: 10px; } }


        .pub-ids {
            font-family: var(--font-mono);
            font-size: 0.7rem;
            color: var(--ink-3);
            letter-spacing: .02em;
            margin-top: 3px;
        }

        /* Scroll progress bar */
        .scroll-progress {
            position: fixed;
            top: 0; left: 0;
            height: 3px;
            width: 0%;
            background: linear-gradient(90deg, var(--gold), var(--green), var(--red));
            z-index: 101;
            transition: width .15s ease-out;
            box-shadow: 0 0 14px rgba(244, 196, 48, 0.5);
        }

        /* Back-to-top floating button */
        .to-top {
            position: fixed;
            right: 1.5rem;
            bottom: 1.5rem;
            width: 46px;
            height: 46px;
            border-radius: 50%;
            background: var(--gold);
            color: var(--bg);
            border: 0;
            cursor: pointer;
            font-size: 1.2rem;
            box-shadow: 0 8px 22px rgba(244, 196, 48, 0.35), 0 0 0 1px rgba(0,0,0,0.2);
            z-index: 99;
            opacity: 0;
            transform: translateY(20px);
            transition: opacity .25s ease, transform .25s ease, background .2s ease;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .to-top.show { opacity: 1; transform: none; }
        .to-top:hover { background: #fff8d6; }

        /* Cursor spotlight (desktop only) */
        .cursor-glow {
            position: fixed;
            inset: 0;
            pointer-events: none;
            z-index: 3;
            background: radial-gradient(420px circle at var(--cx, -999px) var(--cy, -999px),
                rgba(244, 196, 48, 0.07), transparent 60%);
            mix-blend-mode: screen;
            transition: background .12s linear;
        }

        /* ============================================================
           NAVIGATION
        ============================================================ */
        .nav {
            position: fixed;
            top: 0; left: 0; right: 0;
            height: var(--nav-h);
            /* Themed tokens, because ui.js used to set this inline on scroll. */
            background: var(--nav-bg);
            backdrop-filter: blur(18px) saturate(140%);
            -webkit-backdrop-filter: blur(18px) saturate(140%);
            border-bottom: 1px solid var(--border);
            z-index: 100;
            display: flex;
            align-items: center;
        }
        .nav::after {
            content: '';
            position: absolute;
            left: 0; right: 0; bottom: -3px;
            height: 3px;
            background: var(--kente);
            opacity: 0.85;
        }

        .nav-inner {
            max-width: var(--container);
            width: 100%;
            margin: 0 auto;
            padding: 0 1.75rem;
            display: flex;
            align-items: center;
            justify-content: space-between;
            gap: 1.5rem;
        }

        .nav-logo {
            font-family: var(--font-display);
            font-size: 1.05rem;
            color: var(--ink);
            font-weight: 600;
            letter-spacing: 0.06em;
            display: flex;
            align-items: center;
            gap: .55rem;
            white-space: nowrap;
        }
        .nav-logo .dot {
            width: 9px; height: 9px;
            background: var(--gold);
            border-radius: 50%;
            box-shadow: 0 0 12px var(--gold);
            animation: pulse 2.4s ease-in-out infinite;
            transition: opacity .3s ease, transform .3s ease;
        }
        .nav-avatar {
            width: 30px; height: 30px;
            border-radius: 50%;
            object-fit: cover;
            border: 1.5px solid var(--gold);
            box-shadow: 0 0 10px rgba(244, 196, 48, 0.4);
            opacity: 0;
            transform: scale(0.6);
            transition: opacity .3s ease, transform .35s cubic-bezier(.34, 1.56, .64, 1);
            display: none;
            position: absolute;
            margin-left: -2px;
        }
        .nav-avatar.show { opacity: 1; transform: scale(1); display: inline-block; position: static; }
        .nav-logo:has(.nav-avatar.show) .dot { opacity: 0; transform: scale(0); width: 0; margin: 0; }
        .nav-name-short { display: none; }
        /* Measured at a 1280 viewport: full wordmark (229px) + nine labels +
           two controls overflow .nav-inner by 92px. The short name plus the
           tighter gap below recovers ~100px, so the row fits without clipping
           the search chip. 1440 covers the whole tight band. */
        @media (max-width: 1440px) {
            .nav-name-full { display: none; }
            .nav-name-short { display: inline; }
        }
        @media (max-width: 480px) {
            .nav-name-short { font-size: 0.95rem; }
        }
        @keyframes pulse {
            0%, 100% { opacity: 0.6; transform: scale(1); }
            50%      { opacity: 1;   transform: scale(1.18); }
        }

        /* Measured, not styled by eye: nine labels + wordmark + two controls
           NEVER fit the 1200px container at the old 1.7rem gap and .16em
           tracking — the row overflowed its container by 245px even at 1920,
           clipping the search chip, and by 92px at 1280. Compact is therefore
           the default, not a breakpoint special case. */
        .nav-links {
            display: flex;
            gap: 0.72rem;
            list-style: none;
            align-items: center;
        }
        /* One compact treatment at every width — a breakpoint-only fix left
           1920 still 88px over. The ⌘K chip is icon-only for the same reason.
           (Label size/tracking are set in the .nav-links a rule below, which
           is the later — winning — declaration in the cascade.) */
        .nav-cmdk span { display: none; }
        .nav-cmdk { padding: 5px 8px; }
        .nav-links a {
            color: var(--ink-2);
            /* 0.78rem/.16em measured 88px too wide for the container even at
               1920 once Journey joined the nav. Compact fits at every width. */
            font-size: 0.74rem;
            text-transform: uppercase;
            letter-spacing: 0.11em;
            font-weight: 600;
            position: relative;
            padding: 4px 0;
            /* Nine items leave no slack: "OFF THE PITCH" wrapped to three
               lines and clipped against the nav's fixed height. A nav label
               must never wrap. */
            white-space: nowrap;
        }
        .nav-links a::after {
            content: '';
            position: absolute;
            left: 0; right: 100%;
            bottom: -3px;
            height: 2px;
            background: var(--gold);
            transition: right .25s ease;
        }
        .nav-links a:hover { color: var(--gold); }
        .nav-links a:hover::after { right: 0; }
        .nav-links a.active { color: var(--gold); }
        .nav-links a.active::after { right: 0; }

        /* Command palette nav hint */
        .nav-cmdk {
            display: inline-flex;
            align-items: center;
            gap: .45rem;
            font-family: var(--font-mono);
            font-size: 0.72rem;
            color: var(--ink-3);
            border: 1px solid var(--border-strong);
            background: rgba(244, 196, 48, 0.04);
            padding: 5px 10px;
            border-radius: 7px;
            cursor: pointer;
            transition: all .2s ease;
            white-space: nowrap;
        }
        .nav-cmdk:hover { color: var(--gold); border-color: var(--gold); background: var(--gold-dim); }
        .nav-cmdk kbd {
            background: rgba(0,0,0,0.4);
            border: 1px solid var(--border);
            border-radius: 4px;
            padding: 1px 5px;
            font-size: 0.7rem;
        }

        .nav-toggle {
            display: none;
            background: transparent;
            border: 1px solid var(--border-strong);
            color: var(--gold);
            width: 44px; height: 44px;
            border-radius: 8px;
            font-size: 1.2rem;
            align-items: center;
            justify-content: center;
        }

        /* ============================================================
           CONTAINER & SECTIONS
        ============================================================ */
        .section {
            max-width: var(--container);
            margin: 0 auto;
            padding: 6rem 1.75rem;
            position: relative;
        }
        .section-divider {
            max-width: var(--container);
            margin: 0 auto;
            border: 0;
            border-top: 1px solid var(--border);
            position: relative;
        }
        .section-divider::after {
            content: '';
            position: absolute;
            top: -1.5px;
            left: 50%;
            transform: translateX(-50%);
            width: 60px;
            height: 3px;
            background: var(--kente);
            opacity: 0.7;
        }

        .section-header { text-align: center; margin-bottom: 3.5rem; }
        .section-header.left { text-align: left; max-width: 720px; margin-left: 0; margin-right: auto; }
        .section-header.left .section-subtitle { margin-left: 0; }
        .section-header.bare .section-label { display: none; }
        .section-header.compact { margin-bottom: 2rem; }
        /* Soft kente accent under the title when label is hidden */
        .section-header.bare .section-title::after {
            content: '';
            display: block;
            width: 80px;
            height: 3px;
            background: var(--kente);
            opacity: 0.7;
            margin: 1rem auto 0;
            border-radius: 2px;
        }
        .section-header.left.bare .section-title::after { margin-left: 0; }
        .section-label {
            display: inline-block;
            font-family: var(--font-mono);
            font-size: 0.72rem;
            letter-spacing: 0.22em;
            text-transform: uppercase;
            color: var(--gold);
            background: var(--gold-dim);
            border: 1px solid var(--border-strong);
            padding: .35rem .85rem;
            border-radius: 50px;
            margin-bottom: 1.1rem;
        }
        .section-title {
            font-family: var(--font-display);
            font-size: clamp(2rem, 4vw, 2.8rem);
            font-weight: 600;
            letter-spacing: -0.015em;
            line-height: 1.12;
            color: var(--ink);
        }
        .section-title .highlight {
            color: var(--gold);
            font-style: italic;
        }
        .section-subtitle {
            color: var(--ink-3);
            max-width: 640px;
            margin: 1.1rem auto 0;
            font-size: 1.02rem;
        }

        /* Scroll fade-in */
        .fade-in {
            opacity: 0;
            transform: translateY(28px);
            transition: opacity .9s ease, transform .9s ease;
        }
        /* Nothing clears .fade-in except an IntersectionObserver, so with no
           JavaScript every section below the hero stays invisible — the page
           reads as empty. Revealed by default when JS is absent; the anti-FOUC
           script removes .no-js before first paint when it is present.
           Declared AFTER the base rule so it wins without !important. */
        html.no-js .fade-in { opacity: 1; transform: none; }
        .fade-in.visible {
            opacity: 1;
            transform: none;
        }

        /* ============================================================
           HERO
        ============================================================ */
        .hero {
            position: relative;
            min-height: 100vh;
            padding-top: var(--nav-h);
            display: flex;
            align-items: center;
            justify-content: center;
            overflow: hidden;
            background:
                radial-gradient(ellipse 80% 60% at 50% 35%, rgba(244, 196, 48, 0.11), transparent 70%),
                radial-gradient(ellipse 60% 50% at 80% 80%, rgba(31, 146, 73, 0.09), transparent 70%),
                radial-gradient(ellipse 55% 45% at 16% 78%, rgba(212, 50, 75, 0.06), transparent 72%),
                linear-gradient(180deg, #15120a 0%, #1d1810 50%, #14110a 100%);

            /* The band above is DELIBERATELY dark in both themes — it is the
               kente-on-charcoal identity moment. But its text reads theme
               tokens, so in light mode the inks flipped to near-black on the
               dark band and the whole hero went illegible. Re-declaring the
               dark palette here makes every descendant resolve dark-scheme
               values regardless of theme — one block, instead of chasing each
               element. Values must track :root's dark set. */
            --bg: #121009; --bg-2: #1a160c; --bg-card: #221c0e;
            --gold: #f4c430; --gold-dim: rgba(244, 196, 48, 0.18);
            --green: #1f9249; --green-text: #3fbf6e;
            --red: #d4324b; --red-text: #f4697f;
            --ink: #f5edd8; --ink-2: #d8c98c; --ink-3: #ab9059; --ink-4: #ad8e52;
            --border: rgba(244, 196, 48, 0.13);
            --border-strong: rgba(244, 196, 48, 0.26);
            --scrim: rgba(10, 8, 2, 0.55);
        }
        .hero-canvas {
            position: absolute;
            inset: 0;
            width: 100%; height: 100%;
            z-index: 1;
            opacity: 0.55;
        }
        .hero-overlay {
            position: absolute;
            inset: 0;
            background:
                radial-gradient(ellipse at center, transparent 0%, rgba(18, 16, 9, 0.74) 82%);
            z-index: 2;
        }
        .hero-content {
            position: relative;
            z-index: 4;
            text-align: center;
            padding: 2rem 1.5rem;
            max-width: 880px;
        }
        /* A face in the first viewport: the framed portrait stays in About,
           but a small crop up here turns a faceless template into a person
           before the five-second read ends. */
        .hero-face {
            width: 34px; height: 34px;
            border-radius: 50%;
            object-fit: cover;
            border: 1.5px solid var(--gold);
            margin: -4px 2px -4px -8px;
            flex: none;
        }

        /* The evidence strip: the only three third-party-verifiable facts on
           the page, surfaced where the decision to keep reading is made. */
        .hero-proof {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: .6rem;
            margin-top: 20px;
        }
        .proof-chip {
            display: inline-flex;
            align-items: baseline;
            gap: .45rem;
            font-family: var(--font-mono);
            font-size: .72rem;
            letter-spacing: .02em;
            color: var(--ink-2);
            text-decoration: none;
            border: 1px solid var(--border-strong);
            background: var(--scrim);
            padding: .5rem .95rem;
            border-radius: 50px;
            transition: border-color .2s, color .2s, transform .2s;
        }
        .proof-chip:hover {
            border-color: var(--gold);
            color: var(--ink);
            transform: translateY(-1px);
        }
        .proof-kicker {
            color: var(--gold);
            font-weight: 600;
        }
        .proof-chip::after {
            content: "→";
            color: var(--ink-3);
            font-size: .8em;
        }

        .hero-eyebrow {
            display: inline-flex;
            align-items: center;
            gap: .55rem;
            font-family: var(--font-mono);
            font-size: 0.74rem;
            letter-spacing: 0.18em;
            text-transform: uppercase;
            color: var(--gold);
            border: 1px solid var(--border-strong);
            background: var(--scrim);
            padding: .45rem 1rem;
            border-radius: 50px;
            margin-bottom: 1.5rem;
            animation: fadeUp .8s ease forwards;
            opacity: 0;
        }
        .hero-eyebrow .live-dot {
            width: 7px; height: 7px;
            background: var(--green);
            border-radius: 50%;
            box-shadow: 0 0 10px var(--green);
            animation: pulse 2s ease-in-out infinite;
        }
        .hero-name {
            font-family: var(--font-display);
            font-size: clamp(2.5rem, 7vw, 5.2rem);
            font-weight: 600;
            letter-spacing: -0.025em;
            line-height: 1;
            margin-bottom: 0.5rem;
            animation: fadeUp .9s .1s ease forwards;
            opacity: 0;
        }
        .hero-name .ink {
            background: linear-gradient(180deg, var(--ink) 0%, var(--ink-2) 100%);
            -webkit-background-clip: text;
            background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        .hero-name .gold {
            background: linear-gradient(180deg, var(--gold) 0%, #c89a1e 100%);
            -webkit-background-clip: text;
            background-clip: text;
            -webkit-text-fill-color: transparent;
            font-style: italic;
        }
        .hero-headline {
            font-family: var(--font-display);
            font-size: clamp(1.3rem, 2.6vw, 1.85rem);
            color: var(--ink);
            font-weight: 500;
            margin: 1.3rem 0 0.6rem;
            letter-spacing: -0.01em;
            animation: fadeUp 1s .25s ease forwards;
            opacity: 0;
        }
        .hero-headline .accent { color: var(--gold); font-style: italic; }
        .hero-statement {
            color: var(--ink-2);
            font-size: clamp(1rem, 1.5vw, 1.12rem);
            max-width: 660px;
            margin: 0 auto 2rem;
            line-height: 1.6;
            animation: fadeUp 1.1s .4s ease forwards;
            opacity: 0;
        }

        .hero-buttons {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: 0.85rem;
            margin-top: 2.2rem;
            animation: fadeUp 1.2s .55s ease forwards;
            opacity: 0;
        }
        .hero-cv-link {
            display: inline-block;
            margin-top: 1rem;
            font-family: var(--font-mono);
            font-size: 0.84rem;
            letter-spacing: 0.08em;
            color: var(--ink-2);
            text-decoration: none;
            border-bottom: 1px solid var(--border-strong);
            padding-bottom: 1px;
            transition: color .2s ease, border-color .2s ease;
            animation: fadeUp 1.3s .7s ease forwards;
            opacity: 0;
        }
        .hero-cv-link:hover { color: var(--gold); border-bottom-color: var(--gold); }


        .btn {
            display: inline-flex;
            align-items: center;
            gap: .55rem;
            padding: 0.85rem 1.5rem;
            font-family: var(--font-body);
            font-size: 0.92rem;
            font-weight: 600;
            letter-spacing: 0.02em;
            border-radius: 50px;
            border: 1px solid transparent;
            transition: all .25s cubic-bezier(.4, 0, .2, 1);
            cursor: pointer;
            text-decoration: none;
            position: relative;
            overflow: hidden;
        }
        .btn::before {
            content: '';
            position: absolute;
            inset: 0;
            background: radial-gradient(120px circle at var(--bx, 50%) var(--by, 50%),
                rgba(255, 255, 255, 0.15), transparent 60%);
            opacity: 0;
            transition: opacity .25s ease;
        }
        .btn:hover::before { opacity: 1; }

        .btn-primary {
            background: var(--gold);
            color: var(--bg);
            box-shadow: var(--glow-gold);
        }
        .btn-primary:hover {
            transform: translateY(-2px);
            box-shadow: 0 10px 40px rgba(244, 196, 48, 0.55);
            color: var(--bg);
        }
        .btn-secondary {
            background: var(--scrim);
            color: var(--ink);
            border-color: var(--border-strong);
        }
        .btn-secondary:hover {
            border-color: var(--gold);
            color: var(--gold);
            transform: translateY(-2px);
        }
        .btn-ghost {
            background: transparent;
            color: var(--ink-2);
            border-color: var(--border);
        }
        .btn-ghost:hover {
            color: var(--gold);
            border-color: var(--gold);
        }

        /* Hero stats strip */
        .hero-stats {
            display: flex;
            justify-content: center;
            flex-wrap: wrap;
            /* The outcome labels are longer than the old one-worders; a
               tighter gap keeps all four on one row at desktop instead of an
               uneven 2x2 wrap. Labels cap and centre so each stat is a neat
               two-line block. */
            gap: 1.4rem 2rem;
            margin-top: 3.5rem;
            padding-top: 2rem;
            border-top: 1px solid var(--border);
            animation: fadeUp 1.3s .7s ease forwards;
            opacity: 0;
        }
        .hero-stat {
            text-align: center;
            min-width: 110px;
            max-width: 190px;      /* wraps the long outcome labels to 2 lines */
        }
        /* Below the desktop breakpoint the 190px cap clipped the longest label
           by a few pixels; two equal columns fit every label at phone width. */
        @media (max-width: 699px) {
            .hero-stats {
                display: grid;
                grid-template-columns: repeat(2, minmax(0, 1fr));
                gap: 1.4rem 1rem;
            }
            .hero-stat { max-width: none; min-width: 0; }
        }
        /* Four equal columns at desktop: flex sizing put the row a few px over
           the hero column and wrapped it 3+1, which read as a mistake. */
        @media (min-width: 700px) {
            .hero-stats {
                display: grid;
                grid-template-columns: repeat(4, minmax(0, 1fr));
                max-width: 900px;
                margin-left: auto;
                margin-right: auto;
            }
            .hero-stat { max-width: none; }
        }
        .hero-stat-value {
            font-family: var(--font-display);
            font-size: 1.6rem;
            font-weight: 600;
            color: var(--gold);
            line-height: 1;
            margin-bottom: 0.35rem;
        }
        .hero-stat-label {
            font-family: var(--font-mono);
            font-size: 0.7rem;
            letter-spacing: 0.18em;
            text-transform: uppercase;
            color: var(--ink-3);
        }

        /* "Currently" status badge under hero */
        .now-badge {
            display: inline-flex;
            align-items: center;
            gap: 0.75rem;
            margin-top: 2.4rem;
            padding: 0.7rem 1.2rem 0.7rem 0.9rem;
            background: var(--scrim);
            border: 1px solid var(--border-strong);
            border-radius: 50px;
            backdrop-filter: blur(8px);
            text-align: left;
            max-width: 540px;
            margin-left: auto; margin-right: auto;
            opacity: 0;
            animation: fadeUp 1.4s 0.85s ease forwards;
        }
        .now-badge .now-icon {
            font-size: 1.3rem;
            filter: drop-shadow(0 0 8px rgba(244, 196, 48, 0.5));
            flex-shrink: 0;
            animation: floaty 4s ease-in-out infinite;
        }
        @keyframes floaty {
            0%, 100% { transform: translateY(0) rotate(0); }
            50%      { transform: translateY(-3px) rotate(-6deg); }
        }
        .now-badge .now-text { display: flex; flex-direction: column; line-height: 1.3; min-width: 0; }
        .now-badge .now-body, .now-badge .now-icon { transition: opacity .35s ease; }
        .now-badge.fading .now-body, .now-badge.fading .now-icon { opacity: 0; }
        .now-badge .now-label {
            font-family: var(--font-mono);
            font-size: 0.62rem;
            color: var(--gold);
            text-transform: uppercase;
            letter-spacing: 0.18em;
        }
        .now-badge .now-body {
            color: var(--ink-2);
            font-size: 0.86rem;
        }        @keyframes cueDrop {
            0%, 100% { transform: translateY(0); opacity: 0.4; }
            50%      { transform: translateY(8px); opacity: 1; }
        }

        @keyframes fadeUp {
            from { opacity: 0; transform: translateY(28px); }
            to   { opacity: 1; transform: none; }
        }

        /* ============================================================
           AT-A-GLANCE TILES
        ============================================================ */
        .glance {
            display: grid;
            grid-template-columns: repeat(4, 1fr);
            gap: 1rem;
            margin: 5rem auto 0;
            max-width: var(--container);
            padding: 0 1.75rem;
        }
        .glance-tile {
            position: relative;
            padding: 1.4rem 1.25rem;
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            transition: all .25s ease;
            overflow: hidden;
        }
        .glance-tile::after {
            content: '';
            position: absolute;
            inset: 0 0 auto 0;
            height: 2px;
            background: var(--accent, var(--gold));
            opacity: 0.5;
        }
        .glance-tile:hover {
            border-color: var(--border-strong);
            transform: translateY(-3px);
            background: var(--bg-card-hover);
        }
        .glance-tile .icon {
            font-size: 1.4rem;
            margin-bottom: 0.5rem;
            display: block;
        }
        .glance-tile h3 {
            font-family: var(--font-display);
            font-size: 1.02rem;
            color: var(--ink);
            font-weight: 600;
            margin-bottom: 0.3rem;
        }
        .glance-tile p {
            color: var(--ink-3);
            font-size: 0.86rem;
            line-height: 1.5;
        }

        /* ============================================================
           RESEARCH GRID
        ============================================================ */
        .research-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(270px, 1fr));
            gap: 1.5rem;
        }
        .research-card {
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            padding: 1.85rem;
            transition: transform .3s ease, border-color .3s ease, background .3s ease, box-shadow .3s ease;
            position: relative;
            overflow: hidden;
        }
        .research-card::before {
            content: '';
            position: absolute;
            inset: 0;
            background: radial-gradient(circle at var(--mx, 50%) var(--my, 0%),
                rgba(244, 196, 48, 0.08), transparent 50%);
            opacity: 0;
            transition: opacity .4s;
            pointer-events: none;
        }
        .research-card:hover {
            border-color: var(--border-strong);
            background: var(--bg-card-hover);
        }
        .research-card:hover::before { opacity: 1; }

        .research-icon {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 48px; height: 48px;
            background: var(--gold-dim);
            border: 1px solid var(--border-strong);
            border-radius: 12px;
            font-size: 1.5rem;
            margin-bottom: 1rem;
        }
        .research-card h3 {
            font-family: var(--font-display);
            font-size: 1.18rem;
            color: var(--ink);
            margin-bottom: 0.6rem;
            font-weight: 600;
        }
        .research-card p {
            color: var(--ink-3);
            font-size: 0.92rem;
            line-height: 1.6;
            margin-bottom: 1rem;
        }
        .research-tags { display: flex; flex-wrap: wrap; gap: 0.4rem; }
        .research-tag {
            font-family: var(--font-mono);
            font-size: 0.7rem;
            letter-spacing: 0.05em;
            color: var(--ink-2);
            background: rgba(244, 196, 48, 0.06);
            border: 1px solid var(--border);
            padding: 0.22rem 0.55rem;
            border-radius: 50px;
        }

        /* ============================================================
           LYSIS PLAYGROUND
        ============================================================ */
        .playground {
            background: linear-gradient(180deg, var(--bg-2) 0%, var(--bg) 100%);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            padding: 2.5rem 1.8rem;
            position: relative;
            overflow: hidden;
        }
        .playground::before {
            content: '';
            position: absolute;
            top: -100px; right: -100px;
            width: 400px; height: 400px;
            background: radial-gradient(circle, var(--green-dim), transparent 70%);
            pointer-events: none;
        }
        .playground-grid {
            display: grid;
            grid-template-columns: 1fr 280px;
            gap: 2rem;
            align-items: start;
        }
        .playground-canvas-wrap {
            position: relative;
            background: rgba(10, 8, 2, 0.55);
            border: 1px solid var(--border);
            border-radius: var(--radius-sm);
            padding: 1rem;
        }
        .playground-canvas {
            width: 100%;
            height: clamp(320px, 42vh, 460px);
            display: block;
        }
        .playground-controls {
            display: flex;
            flex-direction: column;
            gap: 1.4rem;
        }
        .ctrl {
            display: flex;
            flex-direction: column;
            gap: 0.5rem;
        }
        .ctrl-label {
            display: flex;
            justify-content: space-between;
            align-items: center;
            font-family: var(--font-mono);
            font-size: 0.78rem;
            letter-spacing: 0.05em;
            color: var(--ink-2);
            text-transform: uppercase;
        }
        .ctrl-label .val {
            color: var(--gold);
            font-size: 0.92rem;
            font-weight: 700;
            letter-spacing: 0;
        }
        .ctrl input[type="range"] {
            -webkit-appearance: none;
            appearance: none;
            width: 100%;
            /* 44px hit area with the same 4px visual track: the input is tall,
               the drawn track is a background stripe down its centre. */
            height: 44px;
            background-clip: content-box;
            padding-block: 20px;
            background: linear-gradient(90deg, var(--gold) var(--p, 50%), rgba(244, 196, 48, 0.15) var(--p, 50%));
            border-radius: 4px;
        }
        /* These four sliders sit in a tab order where everything else shows a
           gold ring, so a bare `outline: none` here made them four invisible
           stops — worse than no rings anywhere. Substitute, never just remove. */
        .ctrl input[type="range"]:focus-visible {
            outline: 2px solid var(--gold);
            outline-offset: 4px;
        }
        .ctrl input[type="range"]::-webkit-slider-thumb {
            -webkit-appearance: none;
            width: 18px; height: 18px;
            background: var(--gold);
            border: 3px solid var(--bg);
            border-radius: 50%;
            cursor: pointer;
            box-shadow: var(--glow-gold);
            transition: transform .15s ease;
        }
        .ctrl input[type="range"]::-webkit-slider-thumb:hover { transform: scale(1.15); }
        .ctrl input[type="range"]::-moz-range-thumb {
            width: 18px; height: 18px;
            background: var(--gold);
            border: 3px solid var(--bg);
            border-radius: 50%;
            cursor: pointer;
            box-shadow: var(--glow-gold);
        }
        .ctrl-hint {
            font-size: 0.72rem;
            color: var(--ink-4);
            line-height: 1.4;
        }
        .ctrl-row {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: .5rem;
        }
        .toggle-btn {
            background: var(--scrim);
            border: 1px solid var(--border);
            color: var(--ink-3);
            padding: .55rem .85rem;
            border-radius: var(--radius-sm);
            font-family: var(--font-mono);
            font-size: 0.72rem;
            letter-spacing: 0.04em;
            text-transform: uppercase;
            transition: all .2s ease;
        }
        .toggle-btn:hover { border-color: var(--border-strong); color: var(--ink); }
        .toggle-btn.active { border-color: var(--gold); color: var(--gold); background: var(--gold-dim); }

        .playground-meta {
            display: flex;
            justify-content: space-between;
            margin-top: 1rem;
            padding: 0.85rem 1rem;
            background: rgba(244, 196, 48, 0.04);
            border: 1px solid var(--border);
            border-radius: var(--radius-sm);
            font-family: var(--font-mono);
            font-size: 0.78rem;
            color: var(--ink-2);
            flex-wrap: wrap;
            gap: 0.5rem;
        }
        .playground-meta span strong { color: var(--gold); }

        .playground-legend {
            display: flex;
            gap: 1.4rem;
            font-size: 0.82rem;
            color: var(--ink-2);
            flex-wrap: wrap;
            margin-top: 1rem;
        }
        .playground-legend-dot {
            display: inline-block;
            width: 14px; height: 3px;
            border-radius: 2px;
            margin-right: 0.45rem;
            vertical-align: middle;
        }

        /* ============================================================
           PUBLICATIONS
        ============================================================ */
        /* Filters read as ONE segmented control, not a row of competing gold
           pills — one gold focal point per component. */
        .pub-filters {
            display: flex;
            justify-content: center;
            margin-bottom: 2.5rem;
            flex-wrap: wrap;
        }
        .pub-filters:empty { display: none; }
        .filter-btn {
            background: transparent;
            color: var(--ink-3);
            border: 1px solid var(--border);
            border-right-width: 0;
            padding: 0.5rem 1.2rem;
            border-radius: 0;
            font-family: var(--font-mono);
            font-size: 0.78rem;
            letter-spacing: 0.06em;
            text-transform: uppercase;
            transition: all .2s ease;
        }
        .filter-btn:first-child { border-radius: 9px 0 0 9px; }
        .filter-btn:last-child { border-radius: 0 9px 9px 0; border-right-width: 1px; }
        .filter-btn:hover { color: var(--ink); }
        .filter-btn.active {
            background: var(--gold-dim);
            color: var(--gold);
        }
        .filter-count {
            display: inline-block;
            margin-left: 0.4rem;
            padding: 1px 6px;
            background: rgba(244, 196, 48, 0.12);
            border-radius: 50px;
            font-size: 0.68rem;
            color: var(--ink-3);
            font-weight: 700;
        }
        .filter-btn.active .filter-count {
            background: var(--gold);
            color: var(--bg);
        }

        .pub-list {
            display: flex;
            flex-direction: column;
            gap: 1rem;
            max-width: 920px;
            margin: 0 auto;
        }
        .pub-entry {
            display: grid;
            grid-template-columns: 70px 1fr;
            gap: 1.5rem;
            align-items: start;
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            padding: 1.6rem 1.7rem;
            transition: all .2s ease;
        }
        .pub-entry:hover { border-color: var(--border-strong); background: var(--bg-card-hover); }
        .pub-entry.latest {
            border-color: var(--gold);
            background: linear-gradient(180deg, rgba(244, 196, 48, 0.06), var(--bg-card));
            box-shadow: var(--glow-gold);
        }
        .pub-entry.has-altmetric { grid-template-columns: 70px 1fr auto; }
        .altmetric-wrap {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 0.35rem;
            padding-left: 1rem;
            border-left: 1px dashed var(--border);
            min-width: 80px;
        }
        .altmetric-wrap .altmetric-embed { transform: scale(0.9); }
        .altmetric-label {
            font-family: var(--font-mono);
            font-size: 0.62rem;
            letter-spacing: 0.14em;
            text-transform: uppercase;
            color: var(--ink-3);
        }
        .pub-toggle {
            margin: 1.2rem auto 0;
            display: block;
            background: transparent;
            border: 1px dashed var(--border-strong);
            color: var(--gold);
            padding: 0.7rem 1.4rem;
            border-radius: 50px;
            font-family: var(--font-mono);
            font-size: 0.78rem;
            letter-spacing: 0.08em;
            text-transform: uppercase;
            cursor: pointer;
            transition: all .2s ease;
        }
        .pub-toggle:hover {
            background: var(--gold-dim);
            border-style: solid;
            border-color: var(--gold);
        }
        .pub-group { margin-bottom: 2.4rem; }
        .pub-group-header {
            display: flex;
            align-items: center;
            gap: 0.8rem;
            margin-bottom: 1rem;
        }
        .pub-group-label {
            font-family: var(--font-mono);
            font-size: 0.74rem;
            text-transform: uppercase;
            letter-spacing: 0.12em;
            color: var(--ink-4);
            white-space: nowrap;
        }
        .pub-group-line {
            flex: 1;
            height: 1px;
            background: var(--border);
        }
        @media (max-width: 640px) {
            .pub-entry.has-altmetric { grid-template-columns: 1fr; }
            .altmetric-wrap {
                border-left: 0;
                border-top: 1px dashed var(--border);
                padding-left: 0;
                padding-top: 0.8rem;
                flex-direction: row;
            }
        }
        .pub-year {
            font-family: var(--font-display);
            font-size: 1.85rem;
            font-weight: 600;
            color: var(--gold);
            line-height: 1;
        }
        .pub-title {
            font-family: var(--font-display);
            font-size: 1.12rem;
            font-weight: 600;
            color: var(--ink);
            margin-bottom: 0.45rem;
            line-height: 1.35;
        }
        .pub-authors {
            color: var(--ink-3);
            font-size: 0.88rem;
            line-height: 1.55;
            margin-bottom: 0.55rem;
        }
        .pub-authors em {
            font-style: normal;
            font-weight: 700;
            color: var(--gold);
            background: var(--gold-dim);
            padding: 1px 5px;
            border-radius: 3px;
        }
        .pub-journal {
            font-style: italic;
            color: var(--ink-2);
            font-size: 0.88rem;
            margin-bottom: 0.7rem;
        }
        .pub-meta {
            display: flex;
            gap: 0.6rem;
            flex-wrap: wrap;
            align-items: center;
        }
        /* Statuses are borderless small-caps with a coloured dot — boxes made
           them compete with the CTA buttons beside them. Colour comes from the
           per-status classes below; the dot inherits it. */
        .pub-status {
            font-family: var(--font-mono);
            font-size: 0.68rem;
            letter-spacing: 0.1em;
            text-transform: uppercase;
            padding: 3px 2px;
        }
        .pub-status::before {
            content: "";
            display: inline-block;
            width: 7px; height: 7px;
            border-radius: 50%;
            background: currentColor;
            margin-right: 6px;
            vertical-align: 1px;
        }
        .pub-status.published { color: var(--green-text); }
        .pub-status.preprint  { color: var(--gold); }
        .pub-status.in-review { color: var(--red-text); }
        .pub-status.talk      { color: #c4a8ff; }
        .pub-status.poster    { color: #ff9b6c; }
        /* Was an inline style using var(--green) as TEXT — the one token this
           file documents as background-only — which measured 3.46:1. */
        .pub-status.first-author {
            color: var(--green-text);
            border-color: var(--green-text);
            background: var(--green-dim);
        }
        /* Those two are tuned for the dark card (8.4:1, 8.2:1) and were the only
           status colours with no light-mode value — on the white card they drop
           to 2.0:1. Same hues, darkened to clear AA (5.9:1, 5.5:1). */
        html[data-theme="light"] .pub-status.talk   { color: #6d4ec4; }
        html[data-theme="light"] .pub-status.poster { color: #b04a1f; }
        @media (prefers-color-scheme: light) {
            html:not([data-theme]) .pub-status.talk   { color: #6d4ec4; }
            html:not([data-theme]) .pub-status.poster { color: #b04a1f; }
        }
        .pub-empty {
            text-align: center;
            color: var(--ink-3);
            padding: 2rem;
            font-size: 0.92rem;
        }

        /* ============================================================
           BLOG / WEEKLY NOTES
        ============================================================ */
        .blog-list {
            display: flex;
            flex-direction: column;
            gap: 1rem;
            max-width: 920px;
            margin: 0 auto;
        }
        .blog-card {
            display: grid;
            grid-template-columns: 110px 1fr;
            gap: 1.5rem;
            align-items: start;
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            padding: 1.6rem 1.7rem;
            transition: all .2s ease;
        }
        .blog-card:hover { border-color: var(--border-strong); background: var(--bg-card-hover); }
        .blog-card.latest {
            border-color: var(--gold);
            background: linear-gradient(180deg, rgba(244, 196, 48, 0.06), var(--bg-card));
            box-shadow: var(--glow-gold);
        }
        .blog-date-col {
            display: flex;
            flex-direction: column;
            align-items: flex-start;
            gap: 0.5rem;
            padding-top: 0.1rem;
        }
        .blog-date {
            font-family: var(--font-mono);
            font-size: 0.78rem;
            color: var(--ink-3);
            letter-spacing: 0.04em;
        }
        .blog-new-badge {
            font-family: var(--font-mono);
            font-size: 0.66rem;
            letter-spacing: 0.1em;
            text-transform: uppercase;
            color: var(--gold);
            border: 1px solid var(--gold);
            background: var(--gold-dim);
            padding: 2px 7px;
            border-radius: 4px;
        }
        .blog-body { display: flex; flex-direction: column; gap: 0.5rem; }
        .blog-tags { display: flex; gap: 0.4rem; flex-wrap: wrap; }
        .blog-tag {
            font-family: var(--font-mono);
            font-size: 0.68rem;
            letter-spacing: 0.08em;
            text-transform: uppercase;
            padding: 2px 8px;
            border-radius: 4px;
            border: 1px solid var(--border-strong);
            color: var(--ink-2);
        }
        .blog-title {
            font-family: var(--font-display);
            font-size: 1.15rem;
            font-weight: 600;
            color: var(--ink);
            line-height: 1.3;
            margin: 0;
        }
        .blog-title a { color: inherit; text-decoration: none; }
        .blog-title a:hover { color: var(--gold); }
        .blog-blurb { font-size: 0.92rem; color: var(--ink-2); line-height: 1.65; margin: 0; }
        .blog-read {
            display: inline-flex;
            align-items: center;
            font-family: var(--font-mono);
            font-size: 0.8rem;
            color: var(--gold);
            text-decoration: none;
            margin-top: 0.3rem;
        }
        .blog-read:hover { text-decoration: underline; }
        .blog-empty {
            text-align: center;
            color: var(--ink-3);
            padding: 3rem 2rem;
            font-size: 0.95rem;
            border: 1px dashed var(--border-strong);
            border-radius: var(--radius);
            max-width: 920px;
            margin: 0 auto;
        }
        .blog-empty strong { color: var(--gold); }
        @media (max-width: 640px) {
            .blog-card { grid-template-columns: 1fr; gap: 0.8rem; }
            .blog-date-col { flex-direction: row; align-items: center; }
        }

        /* ============================================================
           PROJECTS / TOOLS GRID
        ============================================================ */
        .card-grid {
            display: grid;
            /* min() keeps 310px from becoming a hard floor on narrow phones,
               where it overflowed the viewport by a couple of pixels. */
            grid-template-columns: repeat(auto-fill, minmax(min(310px, 100%), 1fr));
            gap: 1.4rem;
        }
        .proj-card {
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            overflow: hidden;
            position: relative;
            transition: transform .3s ease, border-color .3s ease, background .3s ease;
            display: flex;
            flex-direction: column;
        }
        .proj-card:hover {
            border-color: var(--border-strong);
            background: var(--bg-card-hover);
        }
        .proj-thumb {
            position: relative;
            height: 165px;
            display: flex;
            align-items: center;
            justify-content: center;
            overflow: hidden;
            background: var(--bg-2);
            border-bottom: 1px solid var(--border);
        }
        /* Real-app screenshots — fanned phone stack */
        .proj-thumb.has-screens {
            background: radial-gradient(120% 80% at 50% 100%, rgba(244, 110, 30, 0.18), transparent 70%),
                        linear-gradient(180deg, var(--bg-2), #1a0e06);
        }        .proj-card:hover .proj-screen-0 { transform: rotate(-13deg) translateY(2px) translateX(-6px); border-color: var(--gold); }
        .proj-card:hover .proj-screen-1 { transform: translateY(-14px) scale(1.12); border-color: var(--gold); }
        .proj-card:hover .proj-screen-2 { transform: rotate(13deg) translateY(2px) translateX(6px); border-color: var(--gold); }        .proj-card:hover .proj-thumb-svg { transform: scale(1.04); }
        .proj-thumb-label {
            position: absolute;
            bottom: 0.6rem;
            left: 0.85rem;
            font-family: var(--font-mono);
            font-size: 0.72rem;
            letter-spacing: 0.08em;
            text-transform: uppercase;
            /* This pill stays dark in both themes (it sits on the thumbnail
               artwork), so its label must NOT follow --ink — in light mode that
               put near-black text on a near-black pill at 2.1:1. Pinned light. */
            color: #f5edd8;
            background: rgba(10, 8, 2, 0.7);
            padding: 0.22rem 0.55rem;
            border-radius: 4px;
            border: 1px solid var(--border);
            z-index: 2;
            backdrop-filter: blur(6px);
        }
        .proj-category-pill {
            position: absolute;
            top: 0.6rem;
            right: 0.6rem;
            font-family: var(--font-mono);
            font-size: 0.65rem;
            letter-spacing: 0.1em;
            text-transform: uppercase;
            padding: 0.2rem 0.5rem;
            border-radius: 4px;
            z-index: 2;
            border: 1px solid;
        }
        .proj-category-pill.science  { color: var(--gold);  background: var(--gold-dim);  border-color: var(--gold); }
        .proj-featured-star {
            display: inline-block;
            color: var(--gold);
            font-size: 0.85em;
            margin-right: 0.18rem;
            filter: drop-shadow(0 0 4px rgba(244, 196, 48, 0.6));
            vertical-align: middle;
            line-height: 1;
        }
        .proj-card.featured {
            border-color: rgba(244, 196, 48, 0.25);
            box-shadow: 0 0 0 1px rgba(244, 196, 48, 0.10), 0 6px 20px rgba(0, 0, 0, 0.3);
        }
        .proj-card.featured:hover {
            border-color: var(--gold);
            box-shadow: var(--glow-gold), 0 12px 28px rgba(0, 0, 0, 0.45);
        }
        .proj-category-pill.personal { color: var(--green-text); background: var(--green-dim); border-color: var(--green-text); }
        .proj-category-pill.news     { color: var(--red-text);   background: var(--red-dim);   border-color: var(--red-text); }

        .proj-body {
            padding: 1.25rem 1.3rem 1.3rem;
            display: flex;
            flex-direction: column;
            flex-grow: 1;
        }        .proj-card h3 {
            font-family: var(--font-display);
            font-size: 1.07rem;
            color: var(--ink);
            margin-bottom: 0.5rem;
            line-height: 1.3;
            font-weight: 600;
        }
        .proj-card p {
            color: var(--ink-3);
            font-size: 0.88rem;
            line-height: 1.55;
            margin-bottom: 0.85rem;
            flex-grow: 1;
        }
        .proj-tags { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-bottom: 1rem; }
        .proj-actions {
            display: flex;
            flex-wrap: wrap;
            gap: 0.55rem;
            margin-top: auto;
        }
        .proj-link {
            display: inline-flex;
            align-items: center;
            gap: 0.3rem;
            font-family: var(--font-mono);
            font-size: 0.78rem;
            letter-spacing: 0.05em;
            color: var(--gold);
            padding: 0.45rem 0.85rem;
            border: 1px solid var(--border-strong);
            border-radius: 50px;
            transition: all .2s ease;
        }
        .proj-link:hover {
            background: var(--gold);
            color: var(--bg);
            border-color: var(--gold);
        }
        .proj-link.alt {
            color: var(--ink-2);
            border-color: var(--border);
        }
        .proj-link.alt:hover {
            background: var(--ink);
            color: var(--bg);
            border-color: var(--ink);
        }

        /* Clickable tool cards — the whole card opens the app, while the
           action buttons (Open / Blog) stay independently clickable above it. */
        .proj-card--link { cursor: pointer; }
        .proj-card--link:hover { border-color: var(--gold); transform: translateY(-3px); }
        .proj-card--link h3 { transition: color .2s ease; }
        .proj-card--link:hover h3 { color: var(--gold); }
        .proj-card-stretch { position: absolute; inset: 0; z-index: 1; font-size: 0; line-height: 0; }
        .proj-card--link .proj-body { position: relative; }
        .proj-card--link .proj-actions { position: relative; z-index: 2; }

        /* ---- Other Tools grid ---- */
        .builds-grid {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
            gap: 1.25rem;
        }
        /* Heading for the homepage side-builds strip. */
        .pg-builds-title {
            font-family: var(--font-display); font-size: 1.15rem; font-weight: 600;
            color: var(--ink); margin: 2.2rem 0 1rem;
        }
        .pg-builds-title + .card-grid { margin-bottom: 1.1rem; }

        .build-card {
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            padding: 1.5rem;
            display: flex;
            flex-direction: column;
            gap: 0.7rem;
            transition: transform .2s ease, border-color .2s ease, background .2s ease;
        }
        .build-card:hover { transform: translateY(-3px); border-color: var(--border-strong); background: var(--bg-card-hover); }
        .build-card-top { display: flex; align-items: baseline; justify-content: space-between; gap: 0.75rem; }
        .build-card h3 { font-family: var(--font-display); font-size: 1.15rem; font-weight: 600; color: var(--ink); }
        .build-year { font-family: var(--font-mono); font-size: 0.7rem; color: var(--ink-4); white-space: nowrap; }
        .build-card p { color: var(--ink-2); font-size: 0.9rem; flex: 1; }
        .build-tags { display: flex; flex-wrap: wrap; gap: 0.35rem; }
        .build-tag {
            font-family: var(--font-mono); font-size: 0.66rem; color: var(--ink-3);
            border: 1px solid var(--border); border-radius: 50px; padding: 2px 8px;
        }
        .build-actions { display: flex; gap: 0.6rem; margin-top: 0.25rem; flex-wrap: wrap; }
        /* Blog link in other-tools cards: same weight as app link */
        .build-actions .proj-link.alt {
            border-color: var(--border-strong);
            color: var(--ink-2);
        }
        .build-actions .proj-link.alt:hover { border-color: var(--gold); color: var(--gold); background: var(--gold-dim); }
        .builds-see-all { text-align: center; margin-top: 2.25rem; }

        /* ---- Zenodo citation (FigureLab / any citable tool) ---- */
        .proj-doi-badge {
            display: inline-block;
            font-family: var(--font-mono);
            font-size: 0.6rem;
            font-weight: 600;
            letter-spacing: 0.08em;
            background: var(--gold);
            /* var(--bg), not a fixed ink: --gold is DARK in light mode (#7d5800), so
               hard-coded dark text on it measured ~2.9:1. This flips with the theme. */
            color: var(--bg);
            padding: 1px 5px;
            border-radius: 4px;
            vertical-align: middle;
            margin-left: 6px;
            line-height: 1.5;
        }
        .proj-citable-note {
            display: block;
            margin-top: 6px;
            font-family: var(--font-mono);
            font-size: 0.72rem;
            color: var(--gold);
            opacity: 0.85;
        }
        .proj-cite-btn {
            border: 1px solid var(--border-strong);
            background: transparent;
            color: var(--ink-2);
            cursor: pointer;
        }
        .proj-cite-btn:hover { border-color: var(--gold); color: var(--gold); background: var(--gold-dim); }
        .proj-citation-block {
            display: none;
            margin-top: 1rem;
            border: 1px solid var(--border-strong);
            border-radius: var(--radius-sm);
            overflow: hidden;
            position: relative;
            z-index: 2;
        }
        .proj-citation-block.open { display: block; }
        .proj-citation-tabs {
            display: flex;
            border-bottom: 1px solid var(--border);
            background: var(--bg-2);
        }
        .cite-tab {
            flex: 1;
            font-family: var(--font-mono);
            font-size: 0.72rem;
            padding: 0.5rem 0.75rem;
            background: transparent;
            border: 0;
            border-right: 1px solid var(--border);
            color: var(--ink-3);
            cursor: pointer;
            transition: color .15s, background .15s;
        }
        .cite-tab:last-child { border-right: 0; }
        .cite-tab:hover { color: var(--ink); background: var(--bg-3); }
        .cite-tab.active { color: var(--gold); background: var(--bg-card); font-weight: 600; }
        .cite-panel { padding: 0.85rem 1rem; background: var(--bg-card); position: relative; }
        .cite-text {
            font-family: var(--font-mono);
            font-size: 0.72rem;
            color: var(--ink-2);
            white-space: pre-wrap;
            word-break: break-all;
            line-height: 1.6;
            margin: 0 0 0.6rem;
        }
        .cite-copy {
            font-family: var(--font-mono);
            font-size: 0.7rem;
            padding: 4px 10px;
            border: 1px solid var(--border-strong);
            border-radius: 6px;
            background: transparent;
            color: var(--ink-3);
            cursor: pointer;
            transition: all .15s;
        }
        .cite-copy:hover { border-color: var(--gold); color: var(--gold); background: var(--gold-dim); }

        /* News card variant */
        .proj-card.news-card .proj-thumb {
            background: linear-gradient(135deg, var(--bg-2), var(--bg-3));
            flex-direction: column;
            gap: 0.5rem;
            padding: 1rem;
            text-align: center;
        }        @media (max-width: 820px) {
        }
        @media (max-width: 480px) {
        }
        @media (hover: none), (pointer: coarse) {
        }
        @keyframes tfHurt {
            0%   { opacity: 0; }
            40%  { opacity: 1; }
            100% { opacity: 0; }
        }

        @media (max-width: 820px) {
        }
        @media (max-width: 480px) {
        }

        /* ============================================================
           RECOGNITION & SERVICE
        ============================================================ */
        /* Featured Patterson hero — sits above the grid */
        .rec-hero {
            display: grid;
            grid-template-columns: minmax(260px, 360px) 1fr;
            gap: 1.8rem;
            align-items: stretch;
            background: linear-gradient(135deg, rgba(244, 196, 48, 0.08), rgba(10, 8, 2, 0.45));
            border: 1px solid var(--gold);
            border-radius: var(--radius);
            overflow: hidden;
            margin-bottom: 1.4rem;
            box-shadow: var(--glow-gold);
        }
        .rec-hero-photo {
            position: relative;
            aspect-ratio: 4 / 3;
            overflow: hidden;
            background: var(--bg-3);
        }
        .rec-hero-photo img {
            width: 100%; height: 100%;
            object-fit: cover;
            transition: transform .6s ease;
        }
        .rec-hero:hover .rec-hero-photo img { transform: scale(1.03); }
        .rec-hero-photo::after {
            content: '';
            position: absolute; inset: 0;
            background: linear-gradient(180deg, transparent 55%, rgba(10, 8, 2, 0.85));
        }
        .rec-hero-tag {
            position: absolute;
            bottom: 0.8rem; left: 0.9rem;
            font-family: var(--font-mono);
            font-size: 0.66rem;
            letter-spacing: 0.14em;
            text-transform: uppercase;
            /* Sits on the photo's dark gradient in both themes, so it needs the
               BRIGHT gold regardless — following --gold put #7d5800 on a
               near-black pill at 1.7:1 in light mode. */
            color: #f4c430;
            background: rgba(10, 8, 2, 0.75);
            border: 1px solid var(--border-strong);
            padding: 0.25rem 0.6rem;
            border-radius: 4px;
            z-index: 2;
        }
        .rec-hero-body {
            padding: 1.6rem 1.8rem 1.6rem 0;
            display: flex;
            flex-direction: column;
            justify-content: center;
        }
        .rec-hero-icon {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 42px; height: 42px;
            background: rgba(244, 196, 48, 0.16);
            border: 1px solid var(--gold);
            border-radius: 10px;
            font-size: 1.2rem;
            margin-bottom: 0.85rem;
        }
        .rec-hero-title {
            font-family: var(--font-display);
            font-size: 1.35rem;
            font-weight: 600;
            color: var(--ink);
            line-height: 1.25;
            margin-bottom: 0.6rem;
        }
        .rec-hero-body p {
            color: var(--ink-3);
            font-size: 0.95rem;
            line-height: 1.6;
            margin-bottom: 0.85rem;
        }
        @media (max-width: 760px) {
            .rec-hero { grid-template-columns: 1fr; }
            .rec-hero-body { padding: 1.4rem 1.4rem 1.6rem; }
            .rec-hero-photo { aspect-ratio: 16 / 10; }
        }

        .rec-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
            gap: 1.4rem;
        }
        .rec-card {
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            padding: 1.6rem 1.6rem 1.4rem;
            position: relative;
            overflow: hidden;
            transition: transform .3s ease, border-color .3s ease, background .3s ease;
        }
        .rec-card:hover {
            border-color: var(--border-strong);
            background: var(--bg-card-hover);
            transform: translateY(-4px);
        }
        .rec-card::before {
            content: '';
            position: absolute;
            top: 0; left: 0; right: 0;
            height: 3px;
            background: var(--accent, var(--gold));
            opacity: 0.6;
        }
        .rec-icon {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 42px; height: 42px;
            background: var(--gold-dim);
            border: 1px solid var(--border-strong);
            border-radius: 10px;
            font-size: 1.2rem;
            margin-bottom: 0.85rem;
        }
        .rec-card.award .rec-icon  { background: rgba(244, 196, 48, 0.16); border-color: var(--gold); }
        .rec-card.service .rec-icon{ background: rgba(26, 128, 64, 0.16);  border-color: var(--green-text); }
        .rec-card.mentor .rec-icon { background: rgba(196, 30, 58, 0.16);  border-color: var(--red-text); }
        .rec-card h3 {
            font-family: var(--font-display);
            font-size: 1.1rem;
            font-weight: 600;
            color: var(--ink);
            margin-bottom: 0.35rem;
            line-height: 1.3;
        }
        .rec-date {
            font-family: var(--font-mono);
            font-size: 0.72rem;
            letter-spacing: 0.08em;
            color: var(--ink-3);
            text-transform: uppercase;
            margin-bottom: 0.6rem;
        }
        .rec-card p {
            color: var(--ink-3);
            font-size: 0.9rem;
            line-height: 1.55;
            margin-bottom: 0.85rem;
        }
        .rec-link {
            display: inline-flex;
            align-items: center;
            gap: 0.3rem;
            font-family: var(--font-mono);
            font-size: 0.78rem;
            color: var(--gold);
        }
        .rec-link:hover { text-decoration: underline; }

        /* Recognition card with feature photo */
        .rec-card.has-photo { padding: 0; overflow: hidden; }
        .rec-card.has-photo .rec-photo {
            width: 100%;
            aspect-ratio: 16 / 10;
            overflow: hidden;
            position: relative;
            background: var(--bg-3);
        }
        .rec-card.has-photo .rec-photo img {
            width: 100%; height: 100%;
            object-fit: cover;
            transition: transform .6s ease;
        }
        .rec-card.has-photo:hover .rec-photo img { transform: scale(1.04); }
        .rec-card.has-photo .rec-photo::after {
            content: '';
            position: absolute;
            inset: 0;
            background: linear-gradient(180deg, transparent 60%, rgba(10, 8, 2, 0.85));
        }
        .rec-card.has-photo .rec-photo-tag {
            position: absolute;
            bottom: 0.7rem;
            left: 0.85rem;
            font-family: var(--font-mono);
            font-size: 0.66rem;
            letter-spacing: 0.16em;
            color: var(--gold);
            background: rgba(10, 8, 2, 0.75);
            border: 1px solid var(--border-strong);
            padding: 0.22rem 0.55rem;
            border-radius: 4px;
            z-index: 2;
            text-transform: uppercase;
        }
        .rec-card.has-photo .rec-body { padding: 1.4rem 1.6rem 1.6rem; }
        .rec-card.has-photo .rec-icon {
            position: absolute;
            top: 0.7rem;
            right: 0.85rem;
            margin-bottom: 0;
            z-index: 2;
        }

        /* ============================================================
           GALLERY — Life in the Lab
        ============================================================ */
        .gallery-grid {
            display: grid;
            grid-template-columns: repeat(6, 1fr);
            grid-auto-rows: 180px;
            gap: 0.75rem;
        }
        .gallery-item {
            position: relative;
            border-radius: var(--radius);
            overflow: hidden;
            background: var(--bg-card);
            border: 1px solid var(--border);
            cursor: pointer;
            transition: transform .4s ease, border-color .3s ease, box-shadow .4s ease;
        }
        .gallery-item img {
            width: 100%;
            height: 100%;
            object-fit: cover;
            transition: transform .6s cubic-bezier(.2, .8, .2, 1), filter .4s ease;
        }
        .gallery-item:hover {
            border-color: var(--gold);
            transform: translateY(-3px);
            box-shadow: 0 18px 40px rgba(0, 0, 0, 0.5), var(--glow-gold);
            z-index: 2;
        }
        .gallery-item:hover img {
            transform: scale(1.06);
            filter: brightness(1.08) saturate(1.05);
        }
        .gallery-overlay {
            position: absolute;
            inset: 0;
            display: flex;
            flex-direction: column;
            justify-content: flex-end;
            padding: 0.9rem 1rem;
            background: linear-gradient(180deg, transparent 30%, rgba(10, 8, 2, 0.85) 100%);
            opacity: 0;
            transition: opacity .35s ease;
        }
        .gallery-item:hover .gallery-overlay { opacity: 1; }
        .gallery-tag {
            display: inline-block;
            align-self: flex-start;
            font-family: var(--font-mono);
            font-size: 0.62rem;
            letter-spacing: 0.16em;
            color: var(--gold);
            background: rgba(10, 8, 2, 0.75);
            border: 1px solid var(--border-strong);
            padding: 0.18rem 0.5rem;
            border-radius: 4px;
            margin-bottom: 0.5rem;
            text-transform: uppercase;
        }
        .gallery-caption {
            font-family: var(--font-display);
            color: var(--ink);
            font-size: 0.92rem;
            line-height: 1.3;
            font-weight: 500;
        }
        /* Masonry-style spans (large 1, mid 2-3, small 4-5) */
        .gallery-item.feature { grid-column: span 3; grid-row: span 2; }
        .gallery-item.tall    { grid-column: span 2; grid-row: span 2; }
        .gallery-item.wide    { grid-column: span 3; grid-row: span 1; }
        .gallery-item.square  { grid-column: span 2; grid-row: span 1; }

        /* Lightbox */
        .lightbox {
            position: fixed;
            inset: 0;
            background: rgba(10, 8, 2, 0.96);
            backdrop-filter: blur(8px);
            z-index: 300;
            display: none;
            align-items: center;
            justify-content: center;
            padding: 2rem;
            animation: cmdkFade .2s ease;
            cursor: zoom-out;
        }
        .lightbox.open { display: flex; }
        .lightbox-figure {
            max-width: min(94vw, 1200px);
            max-height: 92vh;
            display: flex;
            flex-direction: column;
            cursor: default;
        }
        .lightbox img {
            max-width: 100%;
            max-height: 84vh;
            border-radius: var(--radius);
            border: 1px solid var(--border-strong);
            box-shadow: 0 28px 60px rgba(0, 0, 0, 0.7);
            display: block;
            margin: 0 auto;
        }
        .lightbox-cap {
            text-align: center;
            color: var(--ink-2);
            font-family: var(--font-display);
            font-size: 1rem;
            margin-top: 1rem;
            font-style: italic;
        }
        .lightbox-cap small {
            display: block;
            color: var(--ink-3);
            font-family: var(--font-mono);
            font-size: 0.7rem;
            letter-spacing: 0.15em;
            text-transform: uppercase;
            margin-top: 0.4rem;
            font-style: normal;
        }
        .lightbox-close {
            position: absolute;
            top: 1.2rem; right: 1.2rem;
            width: 42px; height: 42px;
            border-radius: 50%;
            background: rgba(244, 196, 48, 0.1);
            border: 1px solid var(--border-strong);
            color: var(--gold);
            font-size: 1.2rem;
            display: flex;
            align-items: center;
            justify-content: center;
            cursor: pointer;
        }
        .lightbox-close:hover { background: var(--gold); color: var(--bg); }

        @media (max-width: 920px) {
            .gallery-grid { grid-template-columns: repeat(4, 1fr); grid-auto-rows: 150px; }
            .gallery-item.feature { grid-column: span 4; grid-row: span 2; }
            .gallery-item.tall    { grid-column: span 2; grid-row: span 2; }
            .gallery-item.wide    { grid-column: span 4; grid-row: span 1; }
            .gallery-item.square  { grid-column: span 2; grid-row: span 1; }
        }
        @media (max-width: 600px) {
            .gallery-grid { grid-template-columns: 1fr 1fr; grid-auto-rows: 140px; }
            .gallery-item.feature, .gallery-item.tall,
            .gallery-item.wide, .gallery-item.square {
                grid-column: span 2; grid-row: span 1;
            }
            .gallery-item.feature { grid-row: span 2; }
        }
        /* Always show overlay on touch */
        @media (hover: none) {
            .gallery-overlay { opacity: 1; }
        }

        /* ============================================================
           ABOUT
        ============================================================ */
        .about-grid {
            display: grid;
            grid-template-columns: 280px 1fr;
            gap: 3rem;
            align-items: start;
        }
        .about-photo {
            width: 240px; height: 240px;
            border-radius: 50%;
            border: 3px solid var(--gold);
            background: linear-gradient(135deg, var(--bg-3), var(--bg-2));
            display: flex;
            align-items: center;
            justify-content: center;
            color: var(--gold);
            box-shadow: var(--glow-gold), inset 0 0 0 6px rgba(10, 8, 2, 0.6);
            margin-bottom: 1.4rem;
            position: relative;
            overflow: hidden;
            transition: transform .4s ease, box-shadow .4s ease;
        }
        .about-photo img {
            width: 100%; height: 100%;
            object-fit: cover;
            display: block;
            transition: transform .6s ease, filter .6s ease;
        }
        .about-photo:hover img {
            transform: scale(1.06);
            filter: saturate(1.1);
        }
        .about-photo::after {
            content: '';
            position: absolute;
            inset: 0;
            background: radial-gradient(circle at 30% 25%, rgba(244, 196, 48, 0.15), transparent 65%);
            pointer-events: none;
            mix-blend-mode: screen;
        }
        /* orbiting decoration around the headshot */
        .about-photo-ring {
            position: relative;
            width: 280px; height: 280px;
            display: flex;
            align-items: center;
            justify-content: center;
            margin-bottom: 0.6rem;
        }
        .about-photo-ring::before,
        .about-photo-ring::after {
            content: '';
            position: absolute;
            border-radius: 50%;
            border: 1px dashed rgba(244, 196, 48, 0.25);
            inset: 0;
            animation: spin 36s linear infinite;
        }
        .about-photo-ring::after {
            inset: 12px;
            border-color: rgba(26, 128, 64, 0.22);
            animation-direction: reverse;
            animation-duration: 48s;
        }
        .about-photo-orbits {
            position: absolute;
            inset: 0;
            pointer-events: none;
            animation: spin 22s linear infinite;
        }
        .about-photo-orbits span {
            position: absolute;
            font-size: 18px;
            filter: drop-shadow(0 0 6px rgba(244, 196, 48, 0.5));
        }
        .about-photo-orbits span:nth-child(1) { top: -6px;  left: 50%;  transform: translateX(-50%); }
        .about-photo-orbits span:nth-child(2) { top: 50%;   right: -6px; transform: translateY(-50%); }
        .about-photo-orbits span:nth-child(3) { bottom: -6px; left: 50%; transform: translateX(-50%); }
        .about-photo-orbits span:nth-child(4) { top: 50%;   left: -6px;  transform: translateY(-50%); }
        @keyframes spin {
            from { transform: rotate(0deg); }
            to   { transform: rotate(360deg); }
        }
        .about-stats {
            display: flex;
            flex-direction: column;
            gap: 0.55rem;
            margin-top: 0.5rem;
        }
        .stat-pill {
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: 50px;
            padding: 0.5rem 0.95rem;
            font-size: 0.85rem;
            color: var(--ink-2);
        }
        .stat-pill strong { color: var(--gold); margin-right: 0.4rem; font-weight: 700; }
        .about-text p {
            color: var(--ink-2);
            font-size: 1rem;
            line-height: 1.75;
            margin-bottom: 1.2rem;
        }
        .about-cv-actions {
            display: flex;
            flex-wrap: wrap;
            gap: 0.6rem;
            margin-top: 1.5rem;
            padding-top: 1.5rem;
            border-top: 1px solid var(--border);
        }
        .about-text p:first-child::first-letter {
            font-family: var(--font-display);
            font-size: 3rem;
            float: left;
            line-height: 0.85;
            margin-right: 0.55rem;
            margin-top: 0.25rem;
            color: var(--gold);
            font-style: italic;
        }
        /* ============================================================
           CONTACT
        ============================================================ */
        /* ============================================================
           CONTACT — creative redesign
        ============================================================ */
        .contact-wrap {
            position: relative;
            max-width: 760px;
            margin: 0 auto;
            padding: 2rem 0;
        }
        .contact-canvas {
            position: absolute;
            inset: -1rem -2rem;
            width: calc(100% + 4rem);
            height: 100%;
            pointer-events: none;
            opacity: 0.45;
            z-index: 0;
        }
        /* The deliberate 2rem bleed poked past the viewport on phones and
           joined the horizontal-overflow pileup. Pin it at small widths. */
        @media (max-width: 600px) {
            .contact-canvas { inset: 0; width: 100%; }
        }        .contact-primary-icon {
            font-size: 2.2rem;
            display: flex;
            align-items: center;
            justify-content: center;
            width: 56px; height: 56px;
            background: var(--gold);
            color: var(--bg);
            border-radius: 14px;
            box-shadow: 0 6px 20px rgba(244, 196, 48, 0.5);
            position: relative;
            z-index: 1;
        }        .copy-feedback {
            position: absolute;
            right: calc(100% + 8px);
            background: var(--gold);
            color: var(--bg);
            padding: 0.3rem 0.7rem;
            border-radius: 6px;
            font-family: var(--font-mono);
            font-size: 0.7rem;
            font-weight: 700;
            letter-spacing: 0.08em;
            text-transform: uppercase;
            white-space: nowrap;
            opacity: 0;
            transform: translateX(8px);
            transition: opacity .25s ease, transform .25s ease;
            pointer-events: none;
        }
        .copy-feedback.show { opacity: 1; transform: translateX(0); }

        /* Dual-email card */
        .contact-emails {
            position: relative;
            z-index: 1;
            display: grid;
            grid-template-columns: auto 1fr;
            gap: 1.2rem;
            align-items: center;
            padding: 1.4rem 1.5rem 1.4rem 1.5rem;
            background: linear-gradient(135deg, rgba(244, 196, 48, 0.10), rgba(26, 128, 64, 0.06));
            border: 1px solid var(--gold);
            border-radius: var(--radius);
            box-shadow: var(--glow-gold);
        }
        .contact-emails-stack {
            display: flex;
            flex-direction: column;
            gap: 0.55rem;
            min-width: 0;
        }
        .contact-email-row {
            display: grid;
            grid-template-columns: 1fr auto;
            align-items: center;
            gap: 0.8rem;
            padding: 0.65rem 0.85rem;
            background: var(--scrim);
            border: 1px solid var(--border);
            border-radius: var(--radius-sm);
            text-decoration: none;
            color: var(--ink);
            transition: all .2s ease;
        }
        .contact-email-row:hover {
            border-color: var(--gold);
            background: rgba(244, 196, 48, 0.08);
            transform: translateY(-1px);
            color: var(--ink);
        }
        .contact-email-row.primary { border-color: var(--border-strong); background: rgba(244, 196, 48, 0.06); }
        .contact-email-text {
            display: flex;
            flex-direction: column;
            min-width: 0;
        }
        .contact-email-label {
            font-family: var(--font-mono);
            font-size: 0.62rem;
            letter-spacing: 0.18em;
            text-transform: uppercase;
            color: var(--gold);
            line-height: 1.2;
            margin-bottom: 0.18rem;
        }
        .contact-email-addr {
            font-family: var(--font-display);
            font-size: 1.05rem;
            font-weight: 600;
            color: var(--ink);
            letter-spacing: -0.01em;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
        }
        .contact-email-actions {
            display: flex;
            align-items: center;
            gap: 0.5rem;
            flex-shrink: 0;
        }
        .contact-email-send {
            display: inline-flex;
            align-items: center;
            padding: 0.35rem 0.75rem;
            border-radius: 8px;
            border: 1px solid var(--border-strong);
            background: transparent;
            color: var(--gold);
            font-family: var(--mono);
            font-size: 0.78rem;
            text-decoration: none;
            cursor: pointer;
            transition: all .2s ease;
            white-space: nowrap;
        }
        .contact-email-send:hover { background: rgba(244, 196, 48, 0.12); border-color: var(--gold); }
        .contact-email-copy {
            background: transparent;
            border: 1px solid var(--border-strong);
            border-radius: 8px;
            color: var(--ink-2);
            width: 30px; height: 30px;
            display: flex;
            align-items: center;
            justify-content: center;
            cursor: pointer;
            transition: all .2s ease;
            flex-shrink: 0;
        }
        .contact-email-copy:hover { color: var(--gold); border-color: var(--gold); background: rgba(244, 196, 48, 0.10); }
        .contact-emails .contact-primary-icon {
            font-size: 2rem;
            width: 56px; height: 56px;
            background: var(--gold);
            color: var(--bg);
            border-radius: 14px;
            box-shadow: 0 6px 20px rgba(244, 196, 48, 0.5);
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .contact-emails .copy-feedback {
            position: absolute;
            top: 0.8rem; right: 0.8rem;
        }
        @media (max-width: 560px) {
            .contact-emails { grid-template-columns: 1fr; }
            .contact-emails .contact-primary-icon { justify-self: center; }
            .contact-email-addr { font-size: 0.92rem; }
        }

        .contact-open-to {
            position: relative;
            z-index: 1;
            display: flex;
            align-items: center;
            gap: 0.75rem;
            flex-wrap: wrap;
            margin-top: 1.8rem;
            padding: 1rem 1.4rem;
            background: var(--scrim);
            border: 1px solid var(--border);
            border-left: 3px solid var(--green);
            border-radius: var(--radius-sm);
        }
        .open-pulse {
            width: 9px; height: 9px;
            background: var(--green);
            border-radius: 50%;
            box-shadow: 0 0 12px var(--green);
            animation: pulse 1.8s ease-in-out infinite;
            flex-shrink: 0;
        }
        .open-label {
            font-family: var(--font-mono);
            font-size: 0.72rem;
            letter-spacing: 0.18em;
            text-transform: uppercase;
            color: var(--green-text);
            font-weight: 700;
        }
        .open-tags { display: flex; flex-wrap: wrap; gap: 0.4rem; }
        .open-tags span {
            font-family: var(--font-body);
            font-size: 0.82rem;
            color: var(--ink-2);
            padding: 0.18rem 0.55rem;
            background: rgba(26, 128, 64, 0.10);
            border: 1px solid rgba(26, 128, 64, 0.30);
            border-radius: 50px;
        }

        .contact-orbits {
            position: relative;
            z-index: 1;
            display: grid;
            grid-template-columns: repeat(5, 1fr);
            gap: 0.75rem;
            margin-top: 1.5rem;
        }
        .orbit-link {
            position: relative;
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 0.4rem;
            padding: 1rem 0.55rem;
            background: var(--bg-card);
            border: 1px solid var(--border);
            border-radius: var(--radius);
            color: var(--ink-2);
            text-decoration: none;
            transition: all .25s ease;
            overflow: hidden;
        }
        .orbit-link::before {
            content: '';
            position: absolute;
            inset: 0 0 auto 0;
            height: 2px;
            background: var(--accent, var(--gold));
            transform: scaleX(0);
            transform-origin: left;
            transition: transform .3s ease;
        }
        .orbit-link:hover {
            transform: translateY(-3px);
            border-color: var(--accent, var(--gold));
            color: var(--ink);
            background: var(--bg-card-hover);
        }
        .orbit-link:hover::before { transform: scaleX(1); }
        .orbit-icon {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 38px; height: 38px;
            border-radius: 50%;
            background: rgba(244, 196, 48, 0.08);
            color: var(--accent, var(--gold));
            font-size: 1.1rem;
            font-weight: 700;
        }
        .orbit-link:hover .orbit-icon {
            background: var(--accent, var(--gold));
            color: var(--bg);
        }
        .orbit-label {
            font-family: var(--font-mono);
            font-size: 0.66rem;
            letter-spacing: 0.14em;
            text-transform: uppercase;
            color: var(--ink-3);
        }
        .orbit-link:hover .orbit-label { color: var(--ink); }

        .contact-foot {
            position: relative;
            z-index: 1;
            text-align: center;
            color: var(--ink-3);
            font-size: 0.82rem;
            margin-top: 1.8rem;
        }
        .contact-foot kbd {
            font-family: var(--font-mono);
            /* Sits on the themed page, so both values must be themed. A fixed
               rgba(0,0,0,0.4) chip with --gold text measured 2.1:1 in light. */
            background: var(--bg-2);
            border: 1px solid var(--border-strong);
            border-radius: 4px;
            padding: 1px 6px;
            font-size: 0.75rem;
            color: var(--ink);
        }

        @media (max-width: 720px) {
            .contact-orbits { grid-template-columns: repeat(3, 1fr); }
            .contact-primary { grid-template-columns: auto 1fr; }
            .contact-primary-copy { grid-column: 2; justify-self: end; margin-top: 0.5rem; }
        }
        @media (max-width: 420px) {
            .contact-orbits { grid-template-columns: repeat(2, 1fr); }
            .contact-primary-addr { font-size: 1.1rem; }
        }

        /* ============================================================
           COMMAND PALETTE
        ============================================================ */
        .cmdk-overlay {
            position: fixed;
            inset: 0;
            background: rgba(10, 8, 2, 0.78);
            backdrop-filter: blur(8px);
            z-index: 200;
            display: none;
            align-items: flex-start;
            justify-content: center;
            padding-top: 14vh;
            animation: cmdkFade .18s ease;
        }
        .cmdk-overlay.open { display: flex; }
        .cmdk {
            width: 100%;
            max-width: 580px;
            background: var(--bg-2);
            border: 1px solid var(--border-strong);
            border-radius: var(--radius);
            box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(244, 196, 48, 0.2);
            overflow: hidden;
            animation: cmdkPop .22s cubic-bezier(.4, 0, .2, 1);
        }
        @keyframes cmdkFade { from { opacity: 0; } to { opacity: 1; } }
        @keyframes cmdkPop {
            from { transform: translateY(-12px) scale(0.96); opacity: 0; }
            to   { transform: none; opacity: 1; }
        }
        .cmdk-input {
            width: 100%;
            background: transparent;
            border: 0;
            border-bottom: 1px solid var(--border);
            color: var(--ink);
            padding: 1.1rem 1.4rem;
            font-family: var(--font-body);
            font-size: 1rem;
            outline: none;
        }
        .cmdk-input::placeholder { color: var(--ink-4); }
        .cmdk-results {
            max-height: 60vh;
            overflow-y: auto;
            padding: 0.5rem;
        }
        .cmdk-group {
            font-family: var(--font-mono);
            font-size: 0.7rem;
            letter-spacing: 0.14em;
            color: var(--ink-4);
            text-transform: uppercase;
            padding: 0.6rem 0.75rem 0.35rem;
        }
        .cmdk-item {
            display: flex;
            align-items: center;
            gap: 0.7rem;
            padding: 0.65rem 0.75rem;
            border-radius: var(--radius-sm);
            cursor: pointer;
            font-size: 0.92rem;
            color: var(--ink-2);
            transition: background .12s ease, color .12s ease;
            text-decoration: none;
        }
        .cmdk-item:hover, .cmdk-item.selected {
            background: var(--gold-dim);
            color: var(--ink);
        }
        .cmdk-item .ic {
            width: 28px; height: 28px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: rgba(244, 196, 48, 0.06);
            border-radius: 6px;
            font-size: 0.95rem;
            flex-shrink: 0;
        }
        .cmdk-item .arrow {
            margin-left: auto;
            font-family: var(--font-mono);
            color: var(--ink-4);
            font-size: 0.75rem;
        }
        .cmdk-foot {
            padding: 0.7rem 1rem;
            background: rgba(0, 0, 0, 0.3);
            border-top: 1px solid var(--border);
            display: flex;
            justify-content: space-between;
            font-family: var(--font-mono);
            font-size: 0.7rem;
            color: var(--ink-4);
            letter-spacing: 0.08em;
        }
        .cmdk-foot kbd {
            background: rgba(0,0,0,0.45);
            border: 1px solid var(--border);
            border-radius: 4px;
            padding: 1px 5px;
            font-size: 0.7rem;
            color: var(--ink-3);
        }
        .cmdk-empty {
            padding: 2rem 1rem;
            text-align: center;
            color: var(--ink-4);
            font-size: 0.9rem;
        }

        /* ============================================================
           FOOTER
        ============================================================ */
        footer {
            text-align: center;
            padding: 3rem 1.5rem 2.5rem;
            border-top: 1px solid var(--border);
            background: var(--bg-2);
            position: relative;
        }
        footer::before {
            content: '';
            position: absolute;
            top: -3px;
            left: 50%;
            transform: translateX(-50%);
            width: 120px;
            height: 3px;
            background: var(--kente);
            opacity: 0.85;
        }
        footer p {
            color: var(--ink-3);
            font-size: 0.88rem;
            margin-bottom: 0.5rem;
        }
        footer p:last-of-type { margin-bottom: 1rem; }
        .footer-dna {
            font-family: var(--font-mono);
            font-size: 1rem;
            letter-spacing: 0.18em;
            margin-top: 0.8rem;
            opacity: 0.85;
        }
        .footer-credit {
            margin-top: 1rem;
            font-size: 0.78rem;
            color: var(--ink-4);
        }
        /* ============================================================
           MOBILE
        ============================================================ */
        @media (max-width: 920px) {
            .playground-grid { grid-template-columns: 1fr; }
            .about-grid { grid-template-columns: 1fr; gap: 2rem; }
            .about-photo-area { display: flex; flex-direction: column; align-items: center; }
        }
        /* The hamburger takes over at 1160, NOT at the 768 the rest of the
           mobile styles use: measured, the nine-label row still overflows by
           22px at 1100, and there is no typography small enough to fit it at
           900 that still reads as a nav. 769–1160 was a broken no-man's-land
           where the row clipped off-screen. */
        @media (max-width: 1160px) {
            .nav-cmdk { display: none; }
            .nav-links {
                position: fixed;
                top: var(--nav-h);
                left: 0; right: 0;
                /* Was a hard-coded rgba(10,8,2,.97). In light mode the drawer
                   stayed near-black while --ink flipped to near-black too, so
                   the whole open mobile menu was black links on a black slab.
                   The token flips with the theme. */
                background: var(--surface-solid);
                backdrop-filter: blur(20px);
                flex-direction: column;
                padding: 1.5rem;
                gap: 1.1rem;
                border-bottom: 1px solid var(--border);
                transform: translateY(-110%);
                transition: transform .3s ease, visibility .3s;
                /* Without this the nine links stay in the tab order while
                   parked off-screen, so tabbing walks focus into nowhere. */
                visibility: hidden;
            }
            .nav-links.open { transform: none; visibility: visible; }
            .nav-links a { font-size: 0.95rem; }
            .nav-toggle { display: inline-flex; }
        }
        @media (max-width: 768px) {
            body::before { display: none; }
            .cursor-glow { display: none; }

            .section { padding: 3rem 1.25rem; }
            .section-header { margin-bottom: 2rem; }
            .glance { grid-template-columns: repeat(2, 1fr); padding: 0 1.25rem; }
            .hero-stats { gap: 1.4rem; }
            .hero-buttons { flex-direction: column; align-items: stretch; max-width: 280px; margin-left: auto; margin-right: auto; }
            .btn { justify-content: center; }
            .pub-entry { grid-template-columns: 1fr; gap: 0.5rem; }
            .pub-year { font-size: 1.3rem; }
        }
        @media (max-width: 480px) {
            .glance { grid-template-columns: 1fr; }
            .hero-stats { padding-top: 1.2rem; margin-top: 2.4rem; gap: 1rem; }
            .hero-stat { min-width: 90px; }
            .hero-stat-value { font-size: 1.3rem; }
            .about-photo { width: 180px; height: 180px; font-size: 3.5rem; }
            .cv-block { padding: 1.5rem; }
            .playground { padding: 1.7rem 1.2rem; }
        }

        /* Reduced motion */
        @media (prefers-reduced-motion: reduce) {
            *, *::before, *::after {
                animation-duration: 0.01ms !important;
                transition-duration: 0.01ms !important;
            }
            .fade-in { opacity: 1; transform: none; }
            /* Smooth scrolling is precisely what this query is asking us to
               stop doing; the base rule sets it on <html>. */
            html { scroll-behavior: auto; }
        }

        /* Touch devices: disable tilt/glow */
        @media (hover: none) {
            .cursor-glow { display: none; }
        }

/* ---- was inline in <body>: research cards ---- */
            .research-card { cursor: pointer; }
            .research-more { display: inline-flex; align-items: center; gap: 5px; margin-top: 12px;
                font-family: var(--font-mono); font-size: 0.68rem; color: var(--ink-3); transition: color .2s; }
            .research-more .chev { transition: transform .25s; }
            .research-card:hover .research-more { color: var(--gold); }
            .research-card.open .research-more .chev { transform: rotate(90deg); }
            .research-detail { max-height: 0; overflow: hidden; transition: max-height .35s ease, margin-top .35s ease; margin-top: 0; }
            .research-card.open .research-detail { max-height: 220px; margin-top: 12px; }
            .research-detail p { font-size: 0.88rem; color: var(--ink-2); line-height: 1.55; margin: 0;
                border-top: 1px solid var(--border); padding-top: 12px; }
            .research-detail em { color: var(--gold); font-style: normal; }

/* ---- was inline in <body>: playground stepper ---- */
        .pg-stepper { display: flex; gap: 6px; margin: 14px 0 0; flex-wrap: wrap; }
        .pg-step {
            font: inherit; color: inherit; -webkit-appearance: none; appearance: none;
            flex: 1 1 0; min-width: 64px; cursor: pointer; border: 1px solid var(--border);
            background: var(--bg-card); border-radius: 10px; padding: 8px 6px 9px; text-align: center;
            transition: border-color .2s, background .2s, transform .2s; position: relative; overflow: hidden;
        }
        .pg-step:hover { border-color: var(--border-strong); transform: translateY(-2px); }
        .pg-step .pg-step-num {
            font-family: var(--font-mono); font-size: 0.62rem; color: var(--ink-4);
            display: inline-flex; width: 18px; height: 18px; border-radius: 50%; border: 1px solid var(--border);
            align-items: center; justify-content: center; margin-bottom: 4px; transition: all .2s;
        }
        .pg-step .pg-step-label { display: block; font-size: 0.64rem; color: var(--ink-3); line-height: 1.25; font-weight: 500; }
        .pg-step.active { border-color: var(--gold); background: var(--gold-dim); }
        .pg-step.active .pg-step-num { background: var(--gold); color: #1a1408; border-color: var(--gold); }
        .pg-step.active .pg-step-label { color: var(--ink); }
        .pg-step.done .pg-step-num { border-color: var(--green-text); color: var(--green-text); }
        .pg-narration {
            margin-top: 12px; border-left: 3px solid var(--gold); background: var(--bg-card);
            border-radius: 0 12px 12px 0; padding: 14px 16px; min-height: 86px;
        }
        .pg-narration-head { display: flex; align-items: center; gap: 10px; margin-bottom: 6px; }
        .pg-stage-badge {
            font-family: var(--font-mono); font-size: 0.7rem; background: var(--gold); color: #1a1408;
            width: 22px; height: 22px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; flex: none;
        }
        .pg-stage-name { font-family: var(--font-display); font-weight: 600; font-size: 1.02rem; color: var(--ink); }
        .pg-stage-text { color: var(--ink-2); font-size: 0.92rem; line-height: 1.55; margin: 0; }
        .pg-stage-text em { color: var(--gold); font-style: normal; }
        .pg-play {
            width: 100%; margin-top: 14px; font-family: var(--font-mono); font-size: 0.85rem; cursor: pointer;
            background: linear-gradient(135deg, var(--gold), #e0a800); color: #1a1408; font-weight: 600;
            border: none; border-radius: 12px; padding: 13px; transition: box-shadow .2s, transform .1s;
        }
        .pg-play:hover { box-shadow: var(--glow-gold); }
        .pg-play:active { transform: scale(0.98); }
        .pg-play.playing { background: var(--bg-card); color: var(--ink-2); border: 1px solid var(--border-strong); }
        #playgroundMeta strong.pressure-low { color: var(--green-text); }
        #playgroundMeta strong.pressure-med { color: var(--gold); }
        #playgroundMeta strong.pressure-high { color: var(--red-text); }
        @media (max-width: 600px) { .pg-step .pg-step-label { font-size: 0.58rem; } }

/* ---- was inline in <body>: publication links + thumbs ---- */
        .pub-title a { color: inherit; text-decoration: none; transition: color .2s ease; }
        .pub-title a:hover { color: var(--gold); text-decoration: underline; text-underline-offset: 3px; }
        .pub-links { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
        .pub-link {
            display: inline-flex; align-items: center; gap: .35rem;
            font-family: var(--font-mono); font-size: 0.76rem; letter-spacing: .04em;
            color: var(--ink-2); padding: .45rem .9rem; border: 1px solid var(--border-strong);
            border-radius: 50px; text-decoration: none; transition: all .18s ease; white-space: nowrap;
        }
        .pub-link:hover { border-color: var(--gold); color: var(--gold); transform: translateY(-1px); }
        .pub-link.primary { background: var(--gold); color: var(--bg); border-color: var(--gold); font-weight: 600; }
        .pub-link.primary:hover { box-shadow: var(--glow-gold); color: var(--bg); }
        .pub-thumb {
            float: right; width: 96px; height: 72px; object-fit: cover; border-radius: 9px;
            border: 1px solid var(--border-strong); margin: 2px 0 10px 16px;
        }
        .pub-thumb-svg { overflow: hidden; }
        .pub-thumb-svg svg { width: 100%; height: 100%; display: block; }
        .pub-entry.featured { border-color: var(--border-strong); }
        .pub-entry.featured.latest { border-color: var(--gold); }
        @media (max-width: 600px) { .pub-thumb { width: 72px; height: 56px; margin-left: 12px; } }

/* ---- was inline in <body>: blog cards ---- */
        /* Whole blog card is now a link */
        a.blog-card { text-decoration: none; color: inherit; cursor: pointer; }
        a.blog-card:hover { border-color: var(--gold); background: var(--bg-card-hover); transform: translateY(-2px); }
        a.blog-card .blog-title { transition: color .2s ease; }
        a.blog-card:hover .blog-title { color: var(--gold); }
        .blog-thumb {
            float: right; width: 108px; height: 78px; object-fit: cover; border-radius: 9px;
            border: 1px solid var(--border-strong); margin: 0 0 10px 16px;
        }
        a.blog-card:hover .blog-read {
            background: var(--gold); color: var(--bg); border-color: var(--gold);
        }
        .blog-read {
            display: inline-flex; align-items: center; gap: .3rem; margin-top: .55rem;
            font-family: var(--font-mono); font-size: 0.78rem; color: var(--gold);
            padding: .4rem .85rem; border: 1px solid var(--border-strong); border-radius: 50px;
            transition: all .18s ease;
        }
        @media (max-width: 600px) { .blog-thumb { width: 84px; height: 60px; margin-left: 12px; } }

/* ---- was inline in <body>: footer credentials ---- */
        .footer-creds { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px 18px; margin-bottom: 1.1rem; }
        .footer-creds a {
            font-family: var(--font-mono); font-size: 0.76rem; letter-spacing: .03em; color: var(--ink-2);
            text-decoration: none; padding: .4rem .9rem; border: 1px solid var(--border-strong); border-radius: 50px;
            transition: all .18s ease;
        }
        .footer-creds a:hover { color: var(--gold); border-color: var(--gold); transform: translateY(-1px); }

/* ================= OFF THE PITCH ================= */
/* The palette was already Ghana's flag; the pitch just leans into it. */
.pitch-grid {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 40px; align-items: start;
}
.pitch-prose p { color: var(--ink-2); margin-bottom: 1rem; max-width: 58ch; }
.pitch-prose strong { color: var(--ink); font-weight: 600; }
.pitch-flag {
    font-size: 0.9rem; color: var(--ink-3); border-left: 2px solid var(--border-strong);
    padding-left: 14px; margin-top: 1.4rem !important;
}

.pitch-widget {
    background: var(--bg-card); border: 1px solid var(--border);
    border-radius: var(--radius, 14px); padding: 24px;
}
.pitch-h3 { font-family: var(--font-display); font-size: 1.15rem; margin-bottom: 4px; }
.pitch-hint { font-family: var(--font-mono); font-size: 0.74rem; color: var(--ink-3); margin-bottom: 16px; }

.pitch-svg { width: 100%; height: auto; display: block; border-radius: 10px; overflow: visible; }
.pitch-turf { fill: var(--green); fill-opacity: 0.13; }
.pitch-lines { stroke: var(--green-text, #3fbf6e); stroke-width: 0.4; stroke-opacity: 0.5; }
.pitch-lines .spot { fill: var(--green-text, #3fbf6e); stroke: none; fill-opacity: 0.5; }

.shirt { cursor: pointer; }
.shirt-disc {
    fill: var(--bg-card-hover); stroke: var(--border-strong); stroke-width: 0.5;
    transition: fill .18s ease, stroke .18s ease;
}
.shirt-num {
    font-family: var(--font-mono); font-size: 4.4px; font-weight: 500;
    fill: var(--ink-2); transition: fill .18s ease;
}
.shirt-pos {
    font-family: var(--font-mono); font-size: 3.1px; letter-spacing: .04em;
    fill: var(--ink-3); transition: fill .18s ease;
}
.shirt:hover .shirt-disc { fill: var(--gold-dim, rgba(244,196,48,.18)); stroke: var(--gold); }
.shirt:hover .shirt-num  { fill: var(--gold); }
.shirt.on .shirt-disc { fill: var(--gold); stroke: var(--gold); }
.shirt.on .shirt-num  { fill: #1a1408; }
.shirt.on .shirt-pos  { fill: var(--gold); }
/* The <g> is the button, so the focus ring has to be drawn on it. */
.shirt:focus-visible { outline: none; }
.shirt:focus-visible .shirt-disc { stroke: var(--gold); stroke-width: 1.1; }

.pitch-detail {
    margin-top: 18px; padding: 16px 18px; min-height: 128px;
    background: var(--bg); border: 1px solid var(--border); border-radius: 10px;
}
.pd-role { font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: .12em;
           text-transform: uppercase; color: var(--gold); }
.pd-name { font-family: var(--font-display); font-size: 1.05rem; margin: 6px 0 8px; }
.pd-note { font-size: 0.9rem; color: var(--ink-2); margin: 0; }

/* Shown only when pitch.js has not run. */
.pitch-fallback { list-style: none; padding: 0; margin: 16px 0 0;
                  display: grid; grid-template-columns: 1fr 1fr; gap: 6px 16px; }
.pitch-fallback li { font-size: 0.85rem; color: var(--ink-2); }
.pitch-fallback strong { font-family: var(--font-mono); font-size: 0.72rem;
                         color: var(--gold); margin-right: 6px; }
.pitch-widget.is-live .pitch-svg { margin-top: 4px; }

@media (max-width: 900px) {
    .pitch-grid { grid-template-columns: 1fr; gap: 28px; }
}
@media (max-width: 480px) {
    .pitch-fallback { grid-template-columns: 1fr; }
    .pitch-widget { padding: 18px; }
}
/* Transparent, finger-sized target sitting under the drawn shirt. */
.shirt-hit { fill: transparent; stroke: none; }

/* ---- publication accessions + citation block ---- */
/* A genome announcement's whole point is the accession; it belongs on the card,
   not only in the paper. */
.pub-data { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 8px; }
.pub-data-label {
    font-family: var(--font-mono); font-size: 0.62rem; letter-spacing: .14em;
    text-transform: uppercase; color: var(--ink-3);
}
/* Accessions are references, not badges: plain underlined mono links. As
   pills they competed with the status chips and the gold CTA on every card. */
.pub-acc {
    font-family: var(--font-mono); font-size: 0.72rem; color: var(--ink-2);
    text-decoration: underline; text-underline-offset: 3px;
    text-decoration-color: var(--border-strong);
    transition: color .18s ease;
}
.pub-acc code { color: inherit; font-family: inherit; }
.pub-acc:hover { color: var(--gold); text-decoration-color: var(--gold); }

.pub-cite-btn { cursor: pointer; font: inherit; background: transparent; }
.pub-citation-block {
    margin-top: 12px; padding: 14px; border: 1px solid var(--border);
    border-radius: 10px; background: var(--bg-2, var(--bg));
}
.pub-citation-block .cite-tabs { display: flex; gap: 6px; margin-bottom: 10px; }
.pub-citation-block .cite-tab {
    font-family: var(--font-mono); font-size: 0.7rem; cursor: pointer;
    background: transparent; color: var(--ink-3);
    border: 1px solid var(--border); border-radius: 6px; padding: 4px 10px;
}
.pub-citation-block .cite-tab.active { color: var(--gold); border-color: var(--gold); }
.pub-citation-block .cite-text {
    font-family: var(--font-mono); font-size: 0.72rem; color: var(--ink-2);
    white-space: pre-wrap; word-break: break-word; margin: 0 0 8px;
    max-height: 240px; overflow: auto;
}
.pub-citation-block .cite-copy {
    font-family: var(--font-mono); font-size: 0.7rem; cursor: pointer;
    background: var(--gold); color: #1a1408; border: 0;
    border-radius: 6px; padding: 5px 12px;
}
/* In-preparation work: real, but visibly not yet peer-reviewed. Muted rather
   than coloured like a published result, so it cannot be mistaken for one. */
.pub-status.inprep {
    color: var(--ink-3); border-color: var(--border-strong);
    background: transparent; font-style: italic;
}

/* ---- "used in published research" on a tool card ----
   Independent uptake is the strongest thing a research-software card can say,
   so it gets the green (positive) accent rather than the neutral border. */
.proj-usedin {
    margin-top: 14px; padding: 14px 16px;
    border: 1px solid var(--green-text); border-radius: 10px;
    background: var(--green-dim);
}
.usedin-badge {
    display: inline-block; font-family: var(--font-mono); font-size: 0.62rem;
    letter-spacing: .14em; text-transform: uppercase; color: var(--green-text);
    margin-bottom: 8px;
}
.usedin-badge::before { content: "✓ "; }
.usedin-quote {
    margin: 0 0 8px; padding: 0; border: 0;
    font-size: 0.88rem; font-style: italic; color: var(--ink); line-height: 1.55;
}
.usedin-cite {
    display: block; font-size: 0.74rem; font-style: normal;
    color: var(--ink-3); line-height: 1.5;
}
.usedin-cite a { color: var(--green-text); text-decoration: none; white-space: nowrap; }
.usedin-cite a:hover { text-decoration: underline; }

/* ============================================================
   PRINT — a recruiter saving the homepage as PDF got a blank
   page: .fade-in starts at opacity 0 and only an
   IntersectionObserver ever clears it, and nothing off-screen
   at print time had been observed.
   ============================================================ */
@media print {
    .fade-in { opacity: 1 !important; transform: none !important; }

    /* Decoration that costs ink and says nothing on paper. Note this also
       hides the playground and TailFiber canvases — deliberate: they are
       interactive and render as empty boxes when printed. */
    canvas,
    .cursor-glow, .scroll-progress, .to-top,
    .nav, .cmdk-overlay, .lightbox,
    .hero-canvas, .hero-overlay,
    .nav-theme-toggle, .nav-cmdk { display: none !important; }

    body, html {
        background: #fff !important;
        color: #000 !important;
    }
    .section, .pub-entry, .proj-card, .research-card, .tally-card {
        break-inside: avoid;
        page-break-inside: avoid;
    }
    a { color: #000 !important; text-decoration: underline; }
    /* A printed link is useless without its target. */
    .pub-links a[href^="http"]::after,
    .usedin-cite a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 0.8em; }
}

/* ---- <kbd> ----
   Was an inline style on one instance with rgba(0,0,0,0.4) and --ink-3 text,
   which measured ~2.1:1 in light mode. One themed rule for every <kbd>. */
kbd {
    font-family: var(--font-mono);
    font-size: 0.82em;
    color: var(--ink);
    background: var(--bg-2);
    border: 1px solid var(--border-strong);
    border-radius: 4px;
    padding: 1px 6px;
    white-space: nowrap;
}

/* ---- Section-level pull quote (FigureLab acknowledgment) ----
   The one piece of third-party proof in Software leads the section; the
   hero's evidence chip anchors here. Green = the "used in published
   research" register established on the tool cards. */
.section-quote {
    max-width: 880px;
    margin: 0 0 30px;
    padding: 24px 28px;
    border: 1px solid var(--green-text);
    border-left-width: 4px;
    border-radius: 14px;
    background: var(--green-dim);
    scroll-margin-top: 90px;      /* the fixed nav must not swallow the anchor */
}
.section-quote blockquote {
    margin: 0 0 12px;
    font-family: var(--font-display);
    font-size: 1.15rem;
    font-style: italic;
    line-height: 1.55;
    color: var(--ink);
}
.section-quote blockquote b { color: var(--green-text); font-style: normal; }
.section-quote figcaption {
    font-size: 0.82rem;
    line-height: 1.6;
    color: var(--ink-2);
}
.section-quote figcaption a { color: var(--green-text); text-decoration: none; }
.section-quote figcaption a:hover { text-decoration: underline; }
.section-quote .quote-zenodo { display: block; margin-top: 6px; color: var(--ink-3); }

/* ---- "Latest" strip inside Publications ----
   Three highest-signal recent items, folded in from the deleted news
   section. A quiet ledger, not a card: mono dates, hairline separators. */
.pub-latest {
    list-style: none;
    max-width: 880px;
    margin: 0 0 34px;
    padding: 0;
    border-top: 1px solid var(--border);
}
.pub-latest li {
    display: flex;
    gap: 18px;
    align-items: baseline;
    padding: 9px 2px;
    border-bottom: 1px solid var(--border);
    font-size: 0.9rem;
    color: var(--ink-2);
    line-height: 1.55;
}
.pub-latest time {
    flex: none;
    width: 86px;
    font-family: var(--font-mono);
    font-size: 0.72rem;
    letter-spacing: 0.04em;
    color: var(--ink-3);
}
.pub-latest a { color: var(--gold); text-decoration: none; }
.pub-latest a:hover { text-decoration: underline; }
@media (max-width: 600px) {
    .pub-latest li { flex-direction: column; gap: 2px; }
    .pub-latest time { width: auto; }
}

/* ---- Talks & Posters ledger ----
   Ten near-identical cards became six merged entries: mono year, Fraunces
   title, muted venue, small-caps kind label with a coloured dot. No cards —
   posters must not outweigh the papers above them. */
.ledger-head {
    display: flex;
    align-items: baseline;
    gap: 14px;
    max-width: 880px;
    margin: 0 0 18px;
}
.ledger-head .section-label { margin: 0; }
.ledger-counts {
    font-family: var(--font-mono);
    font-size: 0.72rem;
    color: var(--ink-3);
}
.talk-ledger { max-width: 880px; }
.ledger-entry {
    padding: 14px 2px;
    border-top: 1px solid var(--border);
}
.ledger-entry:last-child { border-bottom: 1px solid var(--border); }
.ledger-title {
    font-family: var(--font-display);
    font-size: 1.02rem;
    font-weight: 600;
    color: var(--ink);
    margin: 0 0 6px;
}
.ledger-venue {
    display: flex;
    align-items: baseline;
    gap: 12px;
    padding: 2px 0;
    font-size: 0.86rem;
    color: var(--ink-2);
}
.ledger-year {
    flex: none;
    width: 46px;
    font-family: var(--font-mono);
    font-size: 0.74rem;
    color: var(--ink-3);
}
.ledger-where { flex: 1; min-width: 0; }
.ledger-kind {
    flex: none;
    font-family: var(--font-mono);
    font-size: 0.62rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-3);
}
.ledger-kind::before {
    content: "";
    display: inline-block;
    width: 7px; height: 7px;
    border-radius: 50%;
    margin-right: 6px;
    vertical-align: 1px;
}
.ledger-kind.talk::before   { background: var(--green-text); }
.ledger-kind.poster::before { background: var(--gold); }
@media (max-width: 600px) {
    .ledger-venue { flex-wrap: wrap; gap: 6px 12px; }
}

/* "All N posts" expander under the capped blog band */
.blog-more {
    display: inline-block;
    margin-top: 6px;
    padding: 8px 14px;
    font-family: var(--font-mono);
    font-size: 0.78rem;
    color: var(--gold);
    background: transparent;
    border: 1px solid var(--border-strong);
    border-radius: 9px;
    cursor: pointer;
    transition: border-color .2s, color .2s;
}
.blog-more:hover { border-color: var(--gold); }

.tools-more { grid-column: 1 / -1; justify-self: center; }

/* ---- Touch affordances (playground + lifecycle) ---- */
@media (max-width: 600px) {
    .ctrl input[type="range"]::-webkit-slider-thumb { width: 28px; height: 28px; }
    /* interactive mono labels get a legibility floor; decorative eyebrows stay */
    .research-more, .pg-step, .ctrl label { font-size: 0.78rem; }
}
@media (max-width: 768px) {
        }

.btn-ico { vertical-align: -2px; margin-right: 2px; }
.now-dot {
    width: 10px; height: 10px; border-radius: 50%;
    background: var(--green-text);
    animation: pulse 2.4s ease-in-out infinite;
    flex: none;
}

/* ── Recruiter-panel additions ─────────────────────────────────────────
   Three components added after a five-persona screening review:
   the bench card (assay evidence consolidated from four places), the
   contribution line (ownership on an 11-author preprint), and the hero
   stat link (the citation tile now navigates to its evidence). */

.hero-stat-link {
    display: block;
    text-decoration: none;
    color: inherit;
    border-radius: 10px;
    /* Vertical bleed only: negative horizontal margins made the tile wider
       than its own track. */
    padding: 6px 4px;
    margin: -6px 0;
    transition: background .18s ease, transform .18s ease;
}
.hero-stat-link:hover,
.hero-stat-link:focus-visible {
    background: rgba(244, 196, 48, 0.08);
    transform: translateY(-2px);
}

/* Publication ownership line */
.pub-contribution {
    margin: 8px 0 2px;
    padding: 9px 13px;
    border-left: 3px solid var(--gold);
    background: rgba(244, 196, 48, 0.055);
    border-radius: 0 8px 8px 0;
    font-size: 0.88rem;
    line-height: 1.55;
    color: var(--ink);
}
.pub-contribution-kicker {
    display: block;
    font-family: var(--font-mono);
    font-size: 0.63rem;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--gold);
    margin-bottom: 4px;
}

/* "At the bench" — the assay evidence card */
.bench-card {
    margin: 40px 0 0;
    padding: 30px 32px 26px;
    border: 1px solid var(--border-strong);
    border-radius: 18px;
    background: linear-gradient(135deg, rgba(26,128,64,0.05), rgba(244,196,48,0.035));
}
.bench-head { margin-bottom: 22px; }
.bench-kicker {
    display: block;
    font-family: var(--font-mono);
    font-size: 0.7rem;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--green-text);
    margin-bottom: 8px;
}
.bench-head h3 {
    font-size: 1.32rem;
    margin: 0;
    color: var(--ink);
    letter-spacing: -0.01em;
}
/* Two columns, not auto-fit: four blocks across three tracks left a hole
   in the second row that read as a layout bug. */
.bench-cols {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 24px 40px;
}
@media (max-width: 720px) {
    .bench-cols { grid-template-columns: minmax(0, 1fr); }
}
.bench-col h4 {
    font-size: 0.78rem;
    font-family: var(--font-mono);
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--gold);
    margin: 0 0 7px;
    font-weight: 600;
}
.bench-col p {
    margin: 0;
    font-size: 0.9rem;
    line-height: 1.62;
    color: var(--ink-2);
}
@media (max-width: 600px) {
    .bench-card { padding: 24px 20px 20px; }
    .bench-cols { gap: 20px; }
}
/* "How these get built" — the AI-in-the-loop disclosure. Originally styled as a
   dashed, low-contrast footnote; that read as a disclaimer, and design that
   hedges makes a reader wonder whether the author hedges too. It is a statement
   of practice, so it gets a solid card like everything else that means it. */
.build-note {
    max-width: 880px;
    margin: 26px auto 30px;
    padding: 22px 26px;
    border: 1px solid var(--border-strong);
    border-left: 3px solid var(--gold);
    border-radius: 14px;
    background: var(--bg-card, rgba(244, 196, 48, 0.05));
}
.build-note-kicker {
    display: block;
    font-family: var(--font-mono);
    font-size: 0.68rem;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--gold);
    margin-bottom: 8px;
}
.build-note p {
    margin: 0;
    font-size: 0.95rem;
    line-height: 1.68;
    color: var(--ink);
}
@media (max-width: 600px) {
    .build-note { padding: 18px 16px; }
}
/* The primary role, marked. The five roles stay listed; one is named first
   choice so a recruiter is not left guessing which door to knock on. */
.contact-open-to .open-first {
    border-color: var(--gold) !important;
    color: var(--gold) !important;
    font-weight: 600;
}
/* Touch targets. Inline links inside a sentence are exempt from WCAG 2.5.8,
   but these three are standalone controls that measured 17-21px tall on a
   phone — under the 24px minimum and genuinely fiddly to hit. */
@media (pointer: coarse), (max-width: 700px) {
    .pub-acc,
    .rec-link,
    .proof-chip {
        min-height: 24px;
        display: inline-flex;
        align-items: center;
        padding-top: 3px;
        padding-bottom: 3px;
    }
}