:root{--ink:#0e1c2b;--ink2:#17293c;--paper:#f4f6f7;--steel:#5a6e80;--line:#d5dce1;--cobalt:#2557ff;--ok:#27b07a;--bad:#e0524a;--white:#fff}
html{scroll-behavior:smooth;scroll-padding-top:70px}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;color:var(--ink);background:var(--paper);line-height:1.65}
h1,h2,h3,h4{font-family:'Bricolage Grotesque',sans-serif;letter-spacing:-.02em;line-height:1.1}
a{color:var(--cobalt)}
:focus-visible{outline:3px solid var(--cobalt);outline-offset:2px}
.nav-wrap{position:sticky;top:0;z-index:10;background:rgba(244,246,247,.92);backdrop-filter:blur(8px);border-bottom:1px solid var(--line)}
.nav-wrap .brand{font-family:'Bricolage Grotesque';font-weight:800;color:var(--ink);text-decoration:none;font-size:1.15rem}
.nav-wrap a.l{color:var(--steel);text-decoration:none;margin-left:1.4rem;font-size:.95rem}
.nav-wrap a.l:hover{color:var(--ink)}
.hero{background:var(--ink);color:#e8eef3;padding:5rem 0 5.5rem;background-image:linear-gradient(rgba(255,255,255,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.035) 1px,transparent 1px);background-size:44px 44px}
.hero h1{font-size:clamp(2.6rem,6vw,4.6rem);font-weight:800;color:#fff}
.hero .role{font-size:1.25rem;color:#a9bccb;margin:1rem 0 1.2rem}
.hero p.lead{max-width:34rem;color:#c3d0da;font-size:1.05rem}
.btn-main{background:var(--cobalt);border:0;color:#fff;padding:.7rem 1.4rem;border-radius:6px;font-weight:500}
.btn-main:hover{background:#3e6bff;color:#fff}
.btn-ghost{border:1px solid #4a6177;color:#e8eef3;padding:.7rem 1.4rem;border-radius:6px}
.btn-ghost:hover{background:var(--ink2);color:#fff}
.facts{display:flex;flex-wrap:wrap;gap:1.8rem;margin-top:2.2rem;color:#a9bccb;font-size:.95rem}
.facts b{display:block;color:#fff;font-family:'Bricolage Grotesque';font-size:1.3rem}
/* live auth flow */
.flow{background:var(--ink2);border:1px solid #2d4259;border-radius:10px;padding:1.4rem}
.flow h2{font-size:1.05rem;color:#fff;margin:0 0 .3rem}
.flow small{color:#8ea3b4}
.step{display:flex;gap:.9rem;align-items:flex-start;padding:.75rem 0;border-bottom:1px solid #2d4259;opacity:.45;transition:opacity .3s}
.step:last-of-type{border:0}
.step .dot{flex:0 0 26px;height:26px;border-radius:50%;border:2px solid #4a6177;display:grid;place-items:center;font-size:.8rem;color:#8ea3b4;transition:.3s}
.step.on{opacity:1}.step.on .dot{border-color:var(--cobalt);color:#fff}
.step.pass .dot{background:var(--ok);border-color:var(--ok);color:#06231a}
.step.fail .dot{background:var(--bad);border-color:var(--bad);color:#fff}
.step strong{color:#fff;font-weight:500;display:block}
.step span.d{color:#8ea3b4;font-size:.88rem}
.flow .btn-sm{border:1px solid #4a6177;color:#e8eef3;background:transparent;border-radius:6px;padding:.4rem .9rem}
.flow .btn-sm:hover{background:#243a50}
.flow .btn-sm.run{background:var(--cobalt);border-color:var(--cobalt)}
.log{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.78rem;color:#8ea3b4;margin-top:.9rem;min-height:3.4rem}
/* sections */
section.s{padding:4.5rem 0}
section.alt{background:var(--white);border-block:1px solid var(--line)}
.s h2{font-size:clamp(1.8rem,3.5vw,2.5rem);font-weight:800;margin-bottom:.6rem}
.s .intro{color:var(--steel);max-width:38rem;margin-bottom:2.4rem}
.work{border-top:1px solid var(--line);padding:1.7rem 0}
.work:last-child{border-bottom:1px solid var(--line)}
.work h3{font-size:1.45rem;margin-bottom:.2rem}
.work .org{color:var(--steel);font-size:.92rem}
.work ul{margin:.6rem 0 0;padding-left:1.1rem;color:#33475a}
.tag{display:inline-block;border:1px solid var(--line);background:var(--paper);border-radius:4px;padding:.1rem .55rem;margin:.2rem .25rem 0 0;font-size:.82rem;color:#33475a}
.work.feat{border-left:4px solid var(--cobalt);padding-left:1.4rem}
.skillcol h3{font-size:1.1rem;margin-bottom:.7rem}
.skillcol p{color:#33475a;margin:0}
.timeline{border-left:2px solid var(--line);padding-left:1.5rem;margin:0}
.timeline li{list-style:none;position:relative;padding-bottom:1.5rem}
.timeline li::before{content:"";position:absolute;left:-1.95rem;top:.5rem;width:.7rem;height:.7rem;border-radius:50%;background:var(--cobalt)}
.timeline b{font-family:'Bricolage Grotesque';font-size:1.1rem}
.timeline span{display:block;color:var(--steel);font-size:.92rem}
.contact{background:var(--ink);color:#e8eef3;padding:4.5rem 0}
.contact h2{color:#fff;font-size:clamp(1.8rem,3.5vw,2.5rem);font-weight:800}
.contact a.c{display:block;color:#fff;padding:.7rem 0;border-bottom:1px solid #2d4259;text-decoration:none}
.contact a.c:hover{color:#9db6ff}
.contact a.c small{color:#8ea3b4;display:block}
footer{background:var(--ink);color:#6f8496;font-size:.85rem;padding:1.2rem 0;border-top:1px solid #1d3145}
@media (prefers-reduced-motion:reduce){*{transition:none!important;scroll-behavior:auto!important}}

/* Publications listing and reader */

.page-head{background:var(--ink);color:#e8eef3;padding:3.5rem 0 3rem;background-image:linear-gradient(rgba(255,255,255,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.035) 1px,transparent 1px);background-size:44px 44px}
.page-head h1{font-size:clamp(2.2rem,5vw,3.6rem);font-weight:800;color:#fff}
.page-head p{color:#c3d0da;max-width:36rem;margin:.8rem 0 0}
.tools{display:flex;flex-wrap:wrap;gap:.6rem;align-items:center;margin:2rem 0 1.2rem}
.chip{border:1px solid var(--line);background:var(--white);color:#33475a;border-radius:999px;padding:.3rem 1rem;font-size:.92rem;cursor:pointer}
.chip:hover{border-color:var(--steel)}
.chip.active{background:var(--ink);border-color:var(--ink);color:#fff}
#q{flex:1;min-width:200px;max-width:320px;margin-left:auto;border:1px solid var(--line);border-radius:6px;padding:.4rem .8rem;background:var(--white)}
.pub{display:grid;grid-template-columns:5rem 1fr;gap:1.4rem;border-top:1px solid var(--line);padding:1.6rem 0}
.pub:last-child{border-bottom:1px solid var(--line)}
.pub .yr{font-family:'Bricolage Grotesque';font-weight:800;font-size:1.5rem;color:var(--steel)}
.pub h2{font-size:1.35rem;margin:0 0 .25rem}
.pub h2 a{color:var(--ink);text-decoration:none}
.pub h2 a:hover{color:var(--cobalt);text-decoration:underline}
.pub .meta{color:var(--steel);font-size:.9rem}
.pub p{margin:.5rem 0 .3rem;color:#33475a;max-width:42rem}
.badge-t{display:inline-block;border-radius:4px;padding:.05rem .5rem;font-size:.8rem;margin-right:.4rem;border:1px solid var(--line);background:var(--white)}
.badge-t.security{border-color:var(--cobalt);color:var(--cobalt)}
#empty{padding:2rem 0;color:var(--steel)}
@media(max-width:575px){.pub{grid-template-columns:1fr;gap:.3rem}}

[hidden]{display:none!important}
.publication-reader{max-width:760px;margin-inline:auto}.publication-reader h1{overflow-wrap:anywhere}.article-body{white-space:pre-wrap;overflow-wrap:anywhere;font-size:1.1rem;line-height:1.9;border-top:1px solid var(--line);padding-top:2rem;margin-top:2rem}.reader-summary{font-size:1.15rem;color:var(--steel)}.reader-meta{color:var(--steel);font-size:.92rem}.page-head h1{overflow-wrap:anywhere}.publication-index{padding-top:1rem!important}.publication-index .pub h2{font-size:1.35rem}.pub h2 a{overflow-wrap:anywhere}.tools #q{width:100%}.nav-wrap a[aria-current="page"]{color:var(--ink)}
@media(max-width:767px){.nav-wrap>.container{flex-wrap:wrap;gap:.7rem}.nav-wrap nav{display:flex!important;flex-wrap:wrap;gap:.4rem 1rem;width:100%}.nav-wrap a.l{margin-left:0}html{scroll-padding-top:130px}}

/* Shared Content Colours */
.paper-background{background:var(--paper)}
.contact-intro{color:#c3d0da}
.footer-link{color:#6f8496}
