/* ═══════════ Mark Dredze — shared stylesheet ═══════════ */
*,*::before,*::after{box-sizing:border-box}
:root{
  --navy:#04142e; --ink:#14161a; --body:#3a3f47; --mid:#61666e; --faint:#979da5;
  --paper:#fcfcfa; --panel:#f2f2ef; --rule:#e0e1de; --blue:#00378f; --blueL:#6f9ee2; --gar:#8a2433;
  --wrap:1240px;
}
html{scroll-behavior:smooth}
body{margin:0;background:var(--paper);color:var(--ink);font-family:'Source Serif 4',Georgia,serif;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
img{max-width:100%;height:auto;display:block}
a{color:inherit}
.wrap{max-width:var(--wrap);margin:0 auto}
.u{font-family:'IBM Plex Sans',system-ui,sans-serif}

/* ── nav ── */
.nav{position:sticky;top:0;z-index:100;display:flex;align-items:center;gap:20px;flex-wrap:wrap;
  padding:9px clamp(20px,5vw,54px);background:rgba(4,20,46,.97);backdrop-filter:blur(9px);
  border-bottom:1px solid rgba(255,255,255,.14)}
.nav .mk{font:500 15px/1.25 'Source Serif 4';color:#fff;margin-right:auto;text-decoration:none;white-space:nowrap}
.nav .links{display:flex;gap:5px;flex-wrap:wrap}
.nav a.l,.sdnav a,#yjump a,.lk a,.biolink{
  font:500 12px/1 'IBM Plex Sans',system-ui,sans-serif;letter-spacing:.02em;text-transform:none;
  text-decoration:none;padding:9px 13px;border:1px solid var(--rule);border-radius:3px;
  background:transparent;color:var(--ink);transition:background .18s,color .18s,border-color .18s;
  display:inline-block;white-space:nowrap}
.nav a.l{color:rgba(255,255,255,.84);border-color:rgba(255,255,255,.26)}
.nav a.l:hover{background:#fff;color:var(--navy);border-color:#fff}
.nav a.l[aria-current]{background:#fff;color:var(--navy);border-color:#fff}
.sdnav a:hover,#yjump a:hover,.lk a:hover{background:var(--ink);color:#fff;border-color:var(--ink)}
#yjump a,.lk a{font-family:'IBM Plex Mono',monospace;font-size:11px;padding:7px 9px}
.navbtn{display:none;flex-direction:column;justify-content:space-between;width:24px;height:17px;
  padding:0;border:0;background:none;cursor:pointer;flex:none}
.navbtn span{display:block;width:100%;height:2px;background:#fff;border-radius:1px;transition:.2s}
.navbtn[aria-expanded="true"] span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.navbtn[aria-expanded="true"] span:nth-child(2){opacity:0}
.navbtn[aria-expanded="true"] span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}

/* ── hero (home) ── */
.hero{position:relative;background:var(--navy);color:#fff;overflow:hidden;
  padding:clamp(20px,2.6vw,32px) clamp(20px,5vw,54px) clamp(22px,2.6vw,34px);min-height:min(46vh,400px)}
.hero canvas{position:absolute;inset:0;width:100%;height:100%;display:block;opacity:0;transition:opacity 1s}
.hero canvas.on{opacity:1}
.hero .veil{position:absolute;inset:0;pointer-events:none;background:
  linear-gradient(100deg, rgba(4,20,46,.94) 0%, rgba(4,20,46,.80) 34%, rgba(4,20,46,.30) 66%, rgba(4,20,46,.10) 100%)}
.hero .inner{position:relative;display:grid;grid-template-columns:1fr 212px;gap:clamp(28px,5vw,64px);
  align-items:start;max-width:var(--wrap);margin:0 auto}

/* ── page header (subpages) ── */
.phead{background:var(--navy);color:#fff;padding:clamp(24px,3vw,38px) clamp(20px,5vw,54px) clamp(22px,2.8vw,32px)}
.phead h1{font:300 clamp(28px,3.8vw,42px)/1.06 'Source Serif 4';letter-spacing:-.022em;margin:0 0 10px;max-width:26ch}
.phead p{font:400 17px/1.55 'Source Serif 4';color:rgba(255,255,255,.74);margin:0;max-width:66ch}

.eyebrow{font:500 10.5px/1 'IBM Plex Sans';letter-spacing:.2em;text-transform:uppercase;
  color:var(--blueL);display:block;margin-bottom:12px}
.hero h1{font:300 clamp(34px,4.4vw,50px)/1.02 'Source Serif 4';letter-spacing:-.024em;margin:0 0 16px;color:#fff}
.titles{border-left:2px solid var(--blueL);padding-left:16px;margin:0 0 16px}
.titles p{margin:0 0 5px;font:400 17px/1.42 'Source Serif 4';color:rgba(255,255,255,.88)}
.titles p.lead{font:500 19.5px/1.34 'Source Serif 4';color:#fff}
.affil{display:flex;flex-wrap:wrap;gap:0 16px;margin:0 0 16px;padding:0;list-style:none}
.affil li{font:400 12.5px/1.8 'IBM Plex Sans';color:rgba(255,255,255,.6);position:relative;padding-right:18px}
.affil li::after{content:'';position:absolute;right:0;top:50%;width:1px;height:11px;
  background:rgba(255,255,255,.22);transform:translateY(-50%)}
.affil li:last-child{padding-right:0}.affil li:last-child::after{display:none}
.socials{display:flex;gap:8px;flex-wrap:wrap}
.socials a{font:500 11px/1 'IBM Plex Sans';letter-spacing:.05em;color:rgba(255,255,255,.75);
  text-decoration:none;border:1px solid rgba(255,255,255,.24);padding:8px 11px;border-radius:2px;transition:.18s}
.socials a:hover{background:#fff;color:var(--navy);border-color:#fff}
.portrait .ph{aspect-ratio:4/5;overflow:hidden;border:1px solid rgba(255,255,255,.2);background:#0a1c38}
.portrait .ph img{width:100%;height:100%;object-fit:cover;object-position:50% 22%}

/* ── reveal ── */
.rv{opacity:0;transform:translateY(20px);transition:opacity .7s cubic-bezier(.2,.7,.3,1),transform .7s cubic-bezier(.2,.7,.3,1)}
.rv.in{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){.rv{opacity:1!important;transform:none!important;transition:none}
  .hero canvas{display:none}}

/* ── sections ── */
section{padding:clamp(32px,4vw,56px) clamp(20px,5vw,54px)}
section.tight{padding-top:clamp(34px,4vw,52px)}
.kick{font:500 10.5px/1 'IBM Plex Sans';letter-spacing:.19em;text-transform:uppercase;color:var(--gar);
  display:block;margin-bottom:18px}
.h2{font:300 clamp(27px,3.3vw,39px)/1.14 'Source Serif 4';letter-spacing:-.018em;margin:0 0 14px}
.lede{font:400 19.5px/1.62 'Source Serif 4';color:var(--body);margin:0 0 36px;max-width:64ch}
.prose{max-width:68ch}
.prose p{font:400 18px/1.68 'Source Serif 4';color:var(--body);margin:0 0 18px}
.prose h3{font:500 21px/1.35 'Source Serif 4';margin:32px 0 10px;color:var(--ink)}
.prose ul{margin:0 0 18px;padding-left:20px}
.prose li{font:400 17.5px/1.68 'Source Serif 4';color:var(--body);margin-bottom:7px}
.prose a{color:var(--blue);text-decoration:none;border-bottom:1px solid #b9c8e0}
.prose figure{margin:28px 0}
.prose figure img{width:100%;border:1px solid var(--rule)}
.prose figcaption{margin-top:10px;font:400 12.5px/1.4 'IBM Plex Sans';color:var(--faint);text-align:center}
.prose hr{border:0;border-top:1px solid var(--rule);margin:28px 0}
.panelbg{background:var(--panel)}

/* research questions */
.qs{border-top:1px solid var(--ink)}
.q{border-bottom:1px solid var(--rule);padding:22px 0;display:grid;
  grid-template-columns:44px minmax(0,1fr) 320px;gap:26px;align-items:start;transition:.25s}
.q:hover{background:var(--panel);padding-left:14px;padding-right:14px}
.q .n{font:500 11px/1.5 'IBM Plex Mono',monospace;color:var(--faint);padding-top:7px}
.q h3{font:400 clamp(20px,2.3vw,25px)/1.3 'Source Serif 4';margin:0;letter-spacing:-.012em;transition:color .25s}
.q:hover h3{color:var(--blue)}
.q p{margin:0;font:400 15px/1.6 'IBM Plex Sans';color:var(--mid);opacity:.85;transition:opacity .3s}
.q:hover p{opacity:1}

/* notable cards */
.notable{display:grid;grid-template-columns:repeat(auto-fit,minmax(266px,1fr));gap:20px;margin-bottom:32px}
.card{border:1px solid rgba(255,255,255,.18);padding:20px;transition:.28s}
.card:hover{border-color:rgba(255,255,255,.52)}
.badge{display:inline-block;font:500 9.5px/1 'IBM Plex Sans';letter-spacing:.1em;text-transform:uppercase;
  padding:5px 7px;margin-bottom:14px}
.card h3{font:400 17.5px/1.38 'Source Serif 4';margin:0 0 10px;color:#fff}
.card p{margin:0;font:400 13.5px/1.55 'IBM Plex Sans';color:rgba(255,255,255,.56)}
.card .vn{display:block;margin-top:12px;font:500 11px/1 'IBM Plex Mono',monospace;color:var(--blueL)}

/* buttons */
.btn{display:inline-flex;align-items:center;gap:9px;font:500 12.5px/1 'IBM Plex Sans';letter-spacing:.05em;
  text-transform:uppercase;text-decoration:none;padding:14px 20px;transition:.22s;border:0;cursor:pointer}
.btn.light{background:#fff;color:var(--navy)}.btn.light:hover{background:var(--blueL);color:#fff}
.btn.out{border:1px solid var(--ink);color:var(--ink);background:none}.btn.out:hover{background:var(--ink);color:#fff}

/* people */
.people{display:grid;grid-template-columns:repeat(auto-fill,minmax(156px,1fr));gap:18px}
.p .av{aspect-ratio:1;background:linear-gradient(160deg,#dcdcd6,#c2c3bc);margin-bottom:11px;
  position:relative;overflow:hidden}
.p .av img{width:100%;height:100%;object-fit:cover;transition:transform .3s}
.p .av::after{content:'';position:absolute;inset:0;background:var(--blue);opacity:0;transition:opacity .28s}
.p:hover .av::after{opacity:.32}
.p:hover .av img{transform:scale(1.06)}
.p h3{font:500 14.5px/1.3 'Source Serif 4';margin:0 0 3px;transition:color .2s}
.p:hover h3{color:var(--blue)}
.p span{display:block;font:400 11px/1.4 'IBM Plex Mono',monospace;color:var(--mid);margin-bottom:6px}
.p p{margin:0 0 7px;font:400 12.5px/1.5 'IBM Plex Sans';color:var(--mid)}
.p .plinks{display:flex;flex-wrap:wrap;gap:5px}
.p .plinks a{font:500 10px/1 'IBM Plex Mono',monospace;color:var(--mid);text-decoration:none;
  border:1px solid var(--rule);padding:5px 7px;border-radius:2px;transition:.16s}
.p .plinks a:hover{background:var(--ink);color:#fff;border-color:var(--ink)}

/* alumni — compact two-column cards, aligned left-to-right, row by row */
.alumni-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px 40px;margin-top:6px}
@media(max-width:700px){.alumni-grid{grid-template-columns:1fr}}
.alum{padding:16px 0;border-bottom:1px solid var(--rule)}
.alum .ahead{display:flex;gap:14px}
.alum .aph{width:156px;height:156px;flex-shrink:0;background:linear-gradient(160deg,#dcdcd6,#c2c3bc)}
.alum .aph img{width:100%;height:100%;object-fit:cover;display:block}
.alum .ainfo h3{font:500 15px/1.3 'Source Serif 4';margin:0 0 3px;color:var(--ink)}
.alum .ainfo span{display:block;font:400 11px/1.4 'IBM Plex Mono',monospace;color:var(--mid);margin-bottom:3px}
.alum .ainfo em{display:block;font:400 12px/1.4 'IBM Plex Sans';color:var(--mid);font-style:normal;margin-bottom:3px}
.alum .aj,.alum .at{margin:9px 0 0;font:400 12.5px/1.5 'IBM Plex Sans';color:var(--body)}
.alum .at{font-family:'Source Serif 4';font-size:13.5px}


/* news */
.nitem{padding:17px 0;border-bottom:1px solid var(--rule);display:grid;grid-template-columns:150px 1fr;gap:22px}
.nitem time{font:500 11px/1.6 'IBM Plex Sans';letter-spacing:.07em;text-transform:uppercase;color:var(--gar)}
.nitem p{margin:0;font:400 17.5px/1.55 'Source Serif 4';color:var(--ink)}
.nitem a{color:var(--blue);text-decoration:none;border-bottom:1px solid #b9c8e0}

/* doors */
.doors{display:grid;grid-template-columns:repeat(auto-fit,minmax(266px,1fr));gap:20px}
.door{background:#fff;border:1px solid var(--rule);padding:26px;display:flex;flex-direction:column;transition:.26s}
.door:hover{border-color:var(--ink);background:#fff}
.door .kick{color:var(--blue);margin-bottom:13px}
.door h3{font:400 22px/1.28 'Source Serif 4';margin:0 0 10px;letter-spacing:-.012em}
.door p{margin:0 0 18px;font:400 15px/1.6 'IBM Plex Sans';color:var(--mid);flex:1}
.door .sub{background:var(--panel);border-left:2px solid var(--gar);padding:11px 13px;margin:0 0 18px}
.door .sub code{font:500 12px/1.5 'IBM Plex Mono',monospace;color:var(--gar)}
.door a.go{font:500 12px/1 'IBM Plex Sans';letter-spacing:.06em;text-transform:uppercase;color:var(--ink);
  text-decoration:none;border-bottom:1px solid var(--rule);padding-bottom:5px;align-self:flex-start;transition:.2s}
.door a.go:hover{color:var(--blue);border-color:var(--blue)}

.callout{border-left:2px solid var(--blueL);background:var(--panel);padding:18px 24px;margin:0 0 30px;
  font:400 16.5px/1.62 'IBM Plex Sans';color:var(--body);max-width:none;width:100%}
.callout a{color:var(--blue)}

footer{background:var(--navy);color:rgba(255,255,255,.62);padding:44px clamp(20px,5vw,54px);margin-top:0}
footer .wrap{display:flex;flex-wrap:wrap;gap:34px;align-items:flex-start}
footer p{margin:0;font:400 13.5px/1.72 'IBM Plex Sans'}
footer strong{color:#fff;font-weight:500}
footer a{color:#fff;text-decoration:none;border-bottom:1px solid rgba(255,255,255,.3)}
footer nav{display:flex;flex-wrap:wrap;gap:14px}
footer nav a{font:400 12.5px/1.7 'IBM Plex Sans';border:0;color:rgba(255,255,255,.66)}
footer nav a:hover{color:#fff}

@media(max-width:900px){
  .hero .inner{grid-template-columns:1fr}
  .portrait{max-width:212px}
  .q{grid-template-columns:32px minmax(0,1fr);gap:14px}
  .q p{grid-column:2;opacity:1}
  .nitem{grid-template-columns:1fr;gap:6px}
  .pub{grid-template-columns:1fr;gap:6px}
  .navbtn{display:flex}
  .nav .links{display:none;position:absolute;top:100%;left:0;right:0;flex-direction:column;
    gap:0;background:var(--navy);border-bottom:1px solid rgba(255,255,255,.14);
    padding:8px clamp(20px,5vw,54px) 14px;box-shadow:0 12px 24px rgba(0,0,0,.28)}
  .nav .links.open{display:flex}
  .nav a.l{border:0;border-radius:0;padding:13px 0;border-bottom:1px solid rgba(255,255,255,.12);
    width:100%}
  .nav a.l:last-child{border-bottom:0}
  .nav a.l[aria-current],.nav a.l:hover{background:none;color:#fff}
}

/* ── research question with a representative paper ── */
.q{grid-template-columns:44px minmax(0,1fr)}
.q .body{grid-column:2}
@media(max-width:900px){.q{grid-template-columns:30px minmax(0,1fr)}}

/* ── publications page: light variants ── */
.card.lt{border:1px solid var(--rule);background:#fff}
.card.lt:hover{border-color:var(--ink);background:#fbfcfe}
.card.lt h3{color:var(--ink)}
.card.lt p{color:var(--mid)}
.card.lt .vn{color:var(--blue)}
.badge.amL{background:#f3e3e6;color:var(--gar);border:1px solid #dcc0c6}
.badge.awL{background:var(--ink);color:#fff}
#yjump{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:10px}
#yjump a{font:500 11.5px/1 'IBM Plex Mono',monospace;color:var(--mid);text-decoration:none;
  border:1px solid var(--rule);padding:6px 8px;transition:.16s}
#yjump a:hover{border-color:var(--blue);color:var(--blue)}

/* ── compact portrait block ── */
.portrait .ph{aspect-ratio:1/1}
.biolink{display:block;margin-top:8px;color:#fff;border-color:rgba(255,255,255,.26);text-align:center}
.biolink:hover{background:#fff;color:var(--navy);border-color:#fff}
.biolink.media{border-color:rgba(212,150,160,.5);color:#f0c8ce}
.biolink.media:hover{background:#f0c8ce;color:#3a0f16;border-color:#f0c8ce}
.nav .mk i{font-style:normal;color:var(--blueL);margin:0 3px}

/* ── about block on the home page ── */
.abt{display:grid;grid-template-columns:1fr 320px;gap:44px;align-items:start}
.abtside{display:grid;gap:12px}
.abox{background:#fff;border:1px solid var(--rule);padding:16px 18px}
.abox.gar{border-left:2px solid var(--gar)}
.abox strong{display:block;font:600 10.5px/1 'IBM Plex Sans';letter-spacing:.13em;text-transform:uppercase;
  color:var(--mid);margin-bottom:9px}
.abox p{margin:0 0 10px;font:400 14.5px/1.55 'IBM Plex Sans';color:var(--body)}
.abox code{display:block;margin:0 0 10px;font:500 12px/1.5 'IBM Plex Mono',monospace;color:var(--gar)}
.abox a{font:500 12px/1 'IBM Plex Sans';color:var(--blue);text-decoration:none;
  border-bottom:1px solid #b9c8e0}
@media(max-width:900px){.abt{grid-template-columns:1fr;gap:26px}}

/* ── where I publish ── */
.venues{display:grid;grid-template-columns:1fr 1fr;gap:26px;margin-bottom:12px}
.vgroup h3{font:600 10.5px/1 'IBM Plex Sans';letter-spacing:.14em;text-transform:uppercase;
  color:var(--mid);padding-bottom:10px;border-bottom:1px solid var(--ink);margin:0 0 16px}
.vcloud{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:baseline;row-gap:12px}
.vcloud .vn{font:400 'Source Serif 4';color:var(--ink);letter-spacing:-.01em;white-space:nowrap;
  cursor:default;padding-bottom:3px}
.vcloud .vn.s1{font-size:27px}.vcloud .vn.s2{font-size:22px}
.vcloud .vn.s3{font-size:18px}.vcloud .vn.s4{font-size:15px;color:var(--mid)}
.vcloud .vn.cs{border-bottom:2px solid var(--blue)}
.vcloud .vn.hl{border-bottom:2px solid var(--gar)}
.sep{color:var(--rule);margin:0 10px;font-size:15px}
@media(max-width:760px){.venues{grid-template-columns:1fr}}
@media(max-width:600px){
  .vcloud .vn.s1{font-size:20px}.vcloud .vn.s2{font-size:18px}
  .vcloud .vn.s3{font-size:16px}.vcloud .vn.s4{font-size:14px}
}

/* ── software/data/demos ── */
.sdnav{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:6px}
.sdnav a{font:500 12px/1 'IBM Plex Sans';color:var(--ink);text-decoration:none;
  border:1px solid var(--rule);padding:11px 16px;border-radius:3px;transition:.2s}
.sdnav a:hover{background:var(--ink);color:#fff;border-color:var(--ink)}
.res{border-bottom:1px solid var(--rule);padding:18px 0;display:grid;
  grid-template-columns:1fr 190px;gap:24px;transition:.2s}
.res:hover{background:var(--panel);padding-left:12px;padding-right:12px}
.res h4{margin:0 0 6px;font:400 19px/1.34 'Source Serif 4'}
.res h4 a{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--rule)}
.res h4 a:hover{color:var(--blue);border-color:var(--blue)}
.res p{margin:0;font:400 15px/1.6 'IBM Plex Sans';color:var(--mid)}
@media(max-width:760px){.res{grid-template-columns:1fr;gap:6px}}

/* ═══ publications list ═══ */
.pyear{margin-top:3px}
.pyear h3{display:flex;justify-content:space-between;align-items:baseline;gap:14px;
  font:500 12.5px/1 'IBM Plex Sans';letter-spacing:.15em;text-transform:uppercase;color:var(--gar);
  padding-bottom:7px;border-bottom:1px solid var(--ink);margin:4px 0 0;scroll-margin-top:70px}
.pyear:first-child h3{margin-top:0}
.pyear h3 span{font:400 11.5px/1 'IBM Plex Mono',monospace;letter-spacing:.03em;
  text-transform:none;color:var(--faint)}
.pub{display:grid;grid-template-columns:30px minmax(0,1fr);gap:16px;padding:15px 0;
  border-bottom:1px solid var(--rule);transition:background .18s}
.pub.noicon{grid-template-columns:minmax(0,1fr)}
.pub:hover{background:var(--panel);box-shadow:12px 0 0 var(--panel),-12px 0 0 var(--panel)}
.ty{width:24px;height:24px;margin-top:3px;display:grid;place-items:center;border-radius:2px;
  font:600 11px/1 'IBM Plex Mono',monospace;color:#fff;background:var(--mid);cursor:default;user-select:none}
.ty.journal{background:var(--gar)}
.ty.conference{background:var(--blue)}
.ty.workshop{background:#4a7fb5}
.ty.abstract{background:#8a8f97}
.ty.preprint,.ty.techreport{background:#6b7280}
.ty.patent,.ty.thesis,.ty.book{background:#2f6f63}
.pb .ti{font:400 17.5px/1.38 'Source Serif 4';margin:0 0 5px;color:var(--ink)}
.pb .au{font:400 13px/1.55 'IBM Plex Sans';color:var(--body);margin:0 0 3px}
.pb .au b{color:var(--ink);font-weight:600}
.pb .vn{font:400 13.5px/1.5 'Source Serif 4';color:var(--body);margin:0}
.pb .vn i{color:var(--ink)}
.flairs{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 9px}
.flair{display:inline-block;font:600 10px/1 'IBM Plex Sans';letter-spacing:.09em;text-transform:uppercase;
  padding:6px 9px;border-radius:2px}
.flair.am{background:var(--gar);color:#fff}
.flair.aw{background:var(--ink);color:#fff}
.lk{display:flex;flex-wrap:wrap;gap:6px;margin-top:11px}
.lk a{font:500 10.5px/1 'IBM Plex Mono',monospace;text-transform:uppercase;letter-spacing:.03em;
  color:var(--mid);text-decoration:none;background:#fff;border:1px solid var(--rule);
  padding:7px 9px;border-radius:2px;transition:.16s}
.lk a:hover{border-color:var(--blue);color:var(--blue);background:#f4f7fc}
/* the abstract toggle is an on-page control, not a source link — styled as such */
.lk button.ab{display:inline-flex;align-items:center;gap:7px;
  font:600 11px/1 'IBM Plex Sans';letter-spacing:.04em;
  color:var(--blue);background:#eaf0fa;border:1px solid #c2d3ec;
  padding:7px 11px 7px 9px;border-radius:14px;cursor:pointer;transition:.18s;margin-right:3px}
.lk button.ab:hover{background:#dbe6f7;border-color:var(--blue)}
.lk button.ab::before{content:'+';display:grid;place-items:center;width:14px;height:14px;
  border-radius:50%;background:var(--blue);color:#fff;font:600 11px/1 'IBM Plex Mono',monospace}
.lk button.ab.on{background:var(--blue);color:#fff;border-color:var(--blue)}
.lk button.ab.on::before{content:'\2212';background:#fff;color:var(--blue)}
.abs{margin-top:12px;border-left:2px solid var(--blue);background:#fff;padding:14px 16px}
.abs p{margin:0;font:400 15.5px/1.68 'Source Serif 4';color:var(--body)}
@media(max-width:760px){.pub{grid-template-columns:24px 1fr;gap:12px}.ty{width:20px;height:20px;font-size:10px}}

/* type legend */
.tylegend{display:flex;flex-wrap:wrap;gap:14px;margin:0 0 6px}
.tylegend span{display:inline-flex;align-items:center;gap:7px;
  font:400 12px/1 'IBM Plex Sans';color:var(--mid)}
.tylegend .ty{width:19px;height:19px;margin:0;font-size:9.5px}

/* selected recent work — whole card is a link */
a.card.lt{display:block;text-decoration:none}
a.card.lt:hover h3{color:var(--blue)}
a.card.lt .go{display:inline-block;margin-top:12px;font:600 10.5px/1 'IBM Plex Sans';
  letter-spacing:.09em;text-transform:uppercase;color:var(--blue)}

/* wider prose blocks */
.lede.wide{max-width:90ch}
/* speaker bio page */
.bios{display:grid;gap:18px;margin-bottom:34px}
.biobox{border:1px solid var(--rule);background:#fff;padding:22px 24px}
.biobox h3{margin:0 0 4px;font:500 12px/1 'IBM Plex Sans';letter-spacing:.14em;text-transform:uppercase;color:var(--gar)}
.biobox .wc{font:400 11px/1 'IBM Plex Mono',monospace;color:var(--faint);margin:0 0 14px}
.biobox p{margin:0 0 12px;font:400 17.5px/1.66 'Source Serif 4';color:var(--body)}
.biobox p:last-of-type{margin-bottom:0}
.shots{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px}
.shot{border:1px solid var(--rule);background:#fff;padding:12px}
.shot img{width:100%;aspect-ratio:4/5;object-fit:cover;object-position:50% 20%;margin-bottom:10px}
.shot b{display:block;font:500 12.5px/1.4 'IBM Plex Sans';color:var(--ink);margin-bottom:3px}
.shot span{font:400 11px/1.4 'IBM Plex Mono',monospace;color:var(--faint)}
.pron{display:flex;flex-wrap:wrap;gap:26px;align-items:baseline;
  border-left:2px solid var(--gar);background:var(--panel);padding:20px 24px}
.pron .say{font:400 34px/1.1 'Source Serif 4';color:var(--ink);letter-spacing:-.02em}
.pron .say i{font-style:normal;color:var(--gar)}
.pron p{margin:0;font:400 16px/1.6 'IBM Plex Sans';color:var(--body);max-width:56ch}

a.flair{text-decoration:none}
a.flair:hover{filter:brightness(1.25)}
.prose.wide{max-width:86ch}
.alum .ainfo .plinks{display:flex;flex-wrap:wrap;gap:4px}
.alum .ainfo .plinks a{font:500 9.5px/1 'IBM Plex Mono',monospace;color:var(--mid);text-decoration:none;
  border:1px solid var(--rule);padding:4px 6px;border-radius:2px}
.alum .ainfo .plinks a:hover{background:var(--ink);color:#fff;border-color:var(--ink)}

.res{grid-template-columns:1fr}
.res .lk{margin-top:10px}
.res .noline{font:400 11px/1 'IBM Plex Mono',monospace;color:var(--faint)}
.p p{margin:0 0 5px}

/* alumni (other) — plain names in a balanced 3-column list */
.alumni-other{columns:3;column-gap:32px;font:400 14px/1.7 'IBM Plex Sans';color:var(--mid)}
@media(max-width:900px){.alumni-other{columns:2}}
@media(max-width:600px){.alumni-other{columns:1}}

/* homepage citation: same card as the publications list */
.qcite{margin-top:14px}
.titles a.plain{color:#fff;text-decoration:none;border-bottom:0}
.titles a.plain:hover{color:var(--blueL)}
