@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inter-cyrillic-ext-400-normal.BQZuk6qB.woff2) format("woff2"),url(/_astro/inter-cyrillic-ext-400-normal.DQukG94-.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inter-cyrillic-400-normal.obahsSVq.woff2) format("woff2"),url(/_astro/inter-cyrillic-400-normal.HOLc17fK.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inter-greek-ext-400-normal.DGGRlc-M.woff2) format("woff2"),url(/_astro/inter-greek-ext-400-normal.KugGGMne.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inter-greek-400-normal.B4URO6DV.woff2) format("woff2"),url(/_astro/inter-greek-400-normal.q2sYcFCs.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inter-vietnamese-400-normal.DMkecbls.woff2) format("woff2"),url(/_astro/inter-vietnamese-400-normal.Bbgyi5SW.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inter-latin-ext-400-normal.C1nco2VV.woff2) format("woff2"),url(/_astro/inter-latin-ext-400-normal.77YHD8bZ.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inter-latin-400-normal.C38fXH4l.woff2) format("woff2"),url(/_astro/inter-latin-400-normal.CyCys3Eg.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inter-cyrillic-ext-500-normal.B0yAr1jD.woff2) format("woff2"),url(/_astro/inter-cyrillic-ext-500-normal.BmqWE9Dz.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inter-cyrillic-500-normal.BasfLYem.woff2) format("woff2"),url(/_astro/inter-cyrillic-500-normal.CxZf_p3X.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inter-greek-ext-500-normal.C4iEst2y.woff2) format("woff2"),url(/_astro/inter-greek-ext-500-normal.2j5mBUwD.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inter-greek-500-normal.BIZE56-Y.woff2) format("woff2"),url(/_astro/inter-greek-500-normal.Xzm54t5V.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inter-vietnamese-500-normal.DOriooB6.woff2) format("woff2"),url(/_astro/inter-vietnamese-500-normal.mJboJaSs.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inter-latin-ext-500-normal.CV4jyFjo.woff2) format("woff2"),url(/_astro/inter-latin-ext-500-normal.BxGbmqWO.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inter-latin-500-normal.Cerq10X2.woff2) format("woff2"),url(/_astro/inter-latin-500-normal.BL9OpVg8.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/inter-cyrillic-ext-600-normal.Dfes3d0z.woff2) format("woff2"),url(/_astro/inter-cyrillic-ext-600-normal.Bcila6Z-.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/inter-cyrillic-600-normal.CWCymEST.woff2) format("woff2"),url(/_astro/inter-cyrillic-600-normal.4D_pXhcN.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/inter-greek-ext-600-normal.DRtmH8MT.woff2) format("woff2"),url(/_astro/inter-greek-ext-600-normal.B8X0CLgF.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/inter-greek-600-normal.plRanbMR.woff2) format("woff2"),url(/_astro/inter-greek-600-normal.BZpKdvQh.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/inter-vietnamese-600-normal.Cc8MFFhd.woff2) format("woff2"),url(/_astro/inter-vietnamese-600-normal.BuLX-rYi.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/inter-latin-ext-600-normal.D2bJ5OIk.woff2) format("woff2"),url(/_astro/inter-latin-ext-600-normal.CIVaiw4L.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/inter-latin-600-normal.LgqL8muc.woff2) format("woff2"),url(/_astro/inter-latin-600-normal.CiBQ2DWP.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--ink: #0f1419;--ink-2: #4a5159;--ink-3: #8a8f96;--bg: #ffffff;--bg-soft: #f7f8f9;--rule: #e5e7eb;--accent: #1a56db;--accent-hover: #1e40af;--max-width: 1080px;--max-width-wide: 1080px;--content-width: 60rem}*,*:before,*:after{box-sizing:border-box}html{font-size:16px}body{margin:0;color:var(--ink);background:var(--bg);font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Arial,sans-serif;font-feature-settings:"ss01","cv11";line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background:var(--accent);color:#fff}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}a{color:var(--accent);text-decoration:underline;text-decoration-color:#1a56db4d;text-decoration-thickness:1px;text-underline-offset:3px;transition:text-decoration-color .12s ease,color .12s ease}a:hover{color:var(--accent-hover);text-decoration-color:var(--accent-hover)}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}code{padding:.1rem .35rem;background:var(--bg-soft);border-radius:3px;font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:.88em}.masthead{position:sticky;top:0;z-index:50;background:#ffffffeb;backdrop-filter:saturate(160%) blur(8px);-webkit-backdrop-filter:saturate(160%) blur(8px);border-bottom:1px solid var(--rule)}.masthead__inner-wrap{position:relative;max-width:var(--max-width-wide);margin:0 auto;padding:1rem 1.75rem}.greedy-nav{display:flex;align-items:center;gap:1.5rem}.masthead__brand{margin-right:auto;color:var(--ink);font-weight:600;font-size:1rem;letter-spacing:-.01em;text-decoration:none}.masthead__brand:hover{color:var(--accent)}.masthead__menu{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem 1.5rem;margin:0;padding:0;list-style:none}.masthead__menu-item a{position:relative;display:inline-block;padding:.4rem 0;color:var(--ink-2);font-size:.9rem;font-weight:400;text-decoration:none}.masthead__menu-item a:hover,.masthead__menu-item a[aria-current=page]{color:var(--ink)}.masthead__menu-item a[aria-current=page]:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--accent)}.masthead__menu-toggle{display:none;width:44px;height:44px;padding:0;margin:0;background:transparent;border:0;color:var(--ink-2);cursor:pointer;position:relative}.masthead__menu-toggle:hover,.masthead__menu-toggle:focus-visible{color:var(--ink)}.masthead__menu-toggle-bar{position:absolute;left:50%;top:50%;width:22px;height:1.5px;background:currentColor;border-radius:1px;transform:translate(-50%,-50%);transition:transform .18s ease,opacity .14s ease}.masthead__menu-toggle-bar:nth-child(1){transform:translate(-50%,calc(-50% - 6px))}.masthead__menu-toggle-bar:nth-child(3){transform:translate(-50%,calc(-50% + 6px))}.masthead__menu-toggle.is-menu-open .masthead__menu-toggle-bar:nth-child(1){transform:translate(-50%,-50%) rotate(45deg)}.masthead__menu-toggle.is-menu-open .masthead__menu-toggle-bar:nth-child(2){opacity:0}.masthead__menu-toggle.is-menu-open .masthead__menu-toggle-bar:nth-child(3){transform:translate(-50%,-50%) rotate(-45deg)}.hero-banner{--banner-overlay-opacity: .3;--banner-overlay-color: 150, 150, 150;position:relative;width:100%;height:clamp(11rem,24vw,18rem);overflow:hidden;background:#faf6ec;border-bottom:1px solid var(--rule)}.hero-banner img{display:block;width:100%;height:100%;object-fit:cover;object-position:center 57%}.hero-banner:before{content:"";position:absolute;inset:0;background:rgba(var(--banner-overlay-color),var(--banner-overlay-opacity));pointer-events:none;z-index:1}.hero-banner:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,#fff0 60%,#ffffffd9);pointer-events:none;z-index:2}#main{max-width:var(--max-width);margin:0 auto;padding:3rem 1.75rem 4rem}.page{min-width:0}.page__eyebrow{margin:0 0 .5rem;color:var(--ink-3);font-size:.74rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase}.page__title{margin:0 0 2rem;padding-bottom:1.1rem;color:var(--ink);border-bottom:1px solid var(--rule);font-size:2.25rem;font-weight:600;letter-spacing:-.025em;line-height:1.15}.page__content h2{margin:2.6rem 0 1rem;color:var(--ink);font-size:1.4rem;font-weight:600;letter-spacing:-.018em;line-height:1.3}.page__content h3{margin:1.9rem 0 .65rem;color:var(--ink);font-size:1.1rem;font-weight:600;letter-spacing:-.008em}.page__content p,.page__content li{font-size:1rem;color:var(--ink);line-height:1.65}.page__content p{margin:0 0 1rem}.page__content img{max-width:100%;height:auto;border-radius:4px}.text-button{display:inline-flex;align-items:center;gap:.4rem;padding:.55rem 1rem;border:1px solid var(--accent);border-radius:3px;color:#fff;background:var(--accent);font-size:.85rem;font-weight:500;text-decoration:none;line-height:1.2;transition:background .12s ease,border-color .12s ease,color .12s ease}.text-button:hover{color:#fff;background:var(--accent-hover);border-color:var(--accent-hover);text-decoration:none}.text-button--secondary{color:var(--accent);background:transparent}.text-button--secondary:hover{color:#fff;background:var(--accent);border-color:var(--accent)}.cv-actions{display:flex;flex-wrap:wrap;gap:.6rem;margin:1.25rem 0 1.75rem}.cv-pdf{display:block;width:100%;aspect-ratio:1 / 1.414;max-height:90vh;min-height:640px;border:1px solid var(--rule);border-radius:4px;background:var(--bg-soft)}.intro{display:grid;grid-template-columns:9.5rem minmax(0,42rem);gap:1.9rem;align-items:start;justify-content:start;margin:0 0 3rem;padding-bottom:2.25rem;border-bottom:1px solid var(--rule)}.intro__photo{align-self:start;width:9.5rem;margin:3rem 0 0;padding:0}@media(min-width:1180px){.intro__photo{margin-left:-2rem}}.intro__photo img{display:block;width:100%;height:auto;aspect-ratio:4 / 5;object-fit:cover;object-position:center top;border-radius:4px}.intro__body{min-width:0;max-width:42rem;margin:0;padding:0}.intro__name{margin:0 0 .35rem;color:var(--ink);font-size:1.85rem;font-weight:600;letter-spacing:-.018em;line-height:1.15}.intro__body p{margin:0 0 .8rem;color:var(--ink);font-size:.94rem;line-height:1.6}.intro__body p{hyphens:auto;text-align:justify;text-align-last:left}.intro__icons{margin:1.15rem 0 0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:.55rem}.intro__icons li{margin:0}.intro__icons a{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:999px;border:1px solid var(--rule);color:var(--ink-2);background:var(--bg);text-decoration:none;transition:color .12s ease,border-color .12s ease,background .12s ease,transform .12s ease}.intro__icons a:hover{color:var(--accent);border-color:var(--accent);background:#1a56db0f;transform:translateY(-1px)}.intro__icons svg{width:1.05rem;height:1.05rem}.intro__icons .intro__icon-logo{width:2rem;height:2rem;object-fit:cover;object-position:center;border-radius:0}.section{margin:0 0 3.5rem}.section__heading{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin:0 0 1.5rem}.section__heading h2{margin:0!important;color:var(--ink);font-size:1.4rem;font-weight:600;letter-spacing:-.018em}.section__heading h2 .icon{display:inline-block;margin-right:.4rem;font-size:1.1rem;vertical-align:-1px;filter:saturate(95%)}.section__heading a{color:var(--ink-2);font-size:.85rem;font-weight:500;text-decoration:none;white-space:nowrap}.section__heading a:hover{color:var(--accent);text-decoration:underline;text-underline-offset:3px}.featured-publications{display:flex;flex-direction:column;gap:0}.featured-publication[hidden]{display:none}.featured-publication{display:grid;grid-template-columns:9.5rem minmax(0,1fr);gap:1.5rem;align-items:start;padding:1.6rem 0;border-bottom:1px solid var(--rule)}.paper-preview{display:block;width:100%;max-width:9.5rem;text-decoration:none;color:inherit}.paper-preview__image{display:block;width:100%;height:13.25rem;object-fit:cover;object-position:top center;border:1px solid var(--rule);border-radius:3px;background:var(--bg-soft);transition:transform .22s ease,border-color .12s ease}.paper-preview:hover .paper-preview__image{transform:translateY(-3px);border-color:var(--ink-3)}.paper-preview__placeholder{display:flex;flex-direction:column;justify-content:space-between;height:13.25rem;padding:1rem;border:1px solid var(--rule);border-radius:3px;background:linear-gradient(140deg,var(--bg-soft),#fff)}.paper-preview__placeholder-year{font-size:1.5rem;font-weight:600;color:var(--ink);letter-spacing:-.02em}.paper-preview__placeholder-journal{font-size:.7rem;color:var(--ink-3);letter-spacing:.08em;text-transform:uppercase;font-weight:500;line-height:1.3}.featured-publication__body{min-width:0}.page__content .featured-publication__body h3{margin:0 0 .4rem;color:var(--ink);font-size:1.05rem;font-weight:600;letter-spacing:-.008em;line-height:1.35}.featured-publication__body h3 a{color:var(--ink);text-decoration:none}.featured-publication__body h3 a:hover{color:var(--accent);text-decoration:underline;text-underline-offset:3px}.page__content .featured-publication__meta{margin:0 0 .7rem;color:var(--ink-2);font-size:.85rem;line-height:1.5}.featured-publication__meta .journal{color:var(--ink-3);font-style:italic}.featured-abstract{margin-top:0}.page__content .featured-abstract__text{position:relative;overflow:hidden;max-height:5.4rem;margin:0;color:var(--ink-2);font-size:.88rem;line-height:1.55}.featured-abstract.has-overflow:not(.is-expanded) .featured-abstract__text:after{position:absolute;right:0;bottom:0;left:0;height:2.2rem;background:linear-gradient(180deg,#fff0,#fff);content:"";pointer-events:none}.featured-abstract.is-expanded .featured-abstract__text{max-height:none}.featured-abstract.is-expanded .featured-abstract__text:after{display:none}.featured-abstract__toggle{margin:.5rem 0 0;padding:0;border:0;color:var(--accent);background:transparent;font:inherit;font-size:.8rem;font-weight:500;cursor:pointer;text-decoration:underline;text-underline-offset:3px;text-decoration-color:#1a56db4d}.featured-abstract__toggle:hover{color:var(--accent-hover);text-decoration-color:var(--accent-hover)}.featured-abstract__toggle[hidden]{display:none}.featured-publications__more{display:inline-flex;align-items:center;gap:.4rem;margin-top:1.75rem;padding:.6rem 1.1rem;border:1px solid var(--rule);border-radius:3px;background:transparent;color:var(--ink);font:inherit;font-size:.85rem;font-weight:500;cursor:pointer;transition:border-color .12s ease,background .12s ease}.featured-publications__more:hover{border-color:var(--ink);background:var(--bg-soft)}.featured-publications__more[hidden]{display:none}.project-cards,.course-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1.25rem}.project-card,.course-card{display:flex;flex-direction:column;border:1px solid var(--rule);border-radius:6px;overflow:hidden;background:var(--bg);text-decoration:none;color:inherit;transition:border-color .14s ease,transform .14s ease,box-shadow .14s ease}a.project-card:hover,a.course-card:hover{border-color:var(--ink-3);transform:translateY(-2px);box-shadow:0 .6rem 1.6rem -1rem #0f14192e}.course-card__media{position:relative;aspect-ratio:16 / 5;overflow:hidden;background:var(--bg-soft);border-bottom:1px solid var(--rule)}.course-card__media img{display:block;width:100%;height:100%;object-fit:cover;object-position:center}.project-card__media{display:flex;align-items:center;justify-content:center;min-height:8rem;padding:1rem;overflow:hidden;background:var(--bg-soft);border-bottom:1px solid var(--rule)}.project-card__media img{display:block;width:auto;max-width:82%;max-height:6rem;object-fit:contain;object-position:center}.project-card__media--cover{padding:0;min-height:0;aspect-ratio:16 / 5}.project-card__media--cover img{width:100%;height:100%;max-width:none;max-height:none;object-fit:cover;object-position:center}.course-card__media--placeholder{display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--bg-soft),#fff);color:var(--ink-3);font-size:1.3rem;font-weight:600;letter-spacing:.02em;text-align:center;padding:1rem}.project-card__body,.course-card__body{padding:1.1rem 1.2rem 1.25rem;display:flex;flex-direction:column;gap:.35rem;flex:1}.project-card__header{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.6rem}.course-card__kind{margin:-.1rem 0 0;color:var(--ink-3);font-size:.72rem;font-weight:500;letter-spacing:.1em;text-transform:uppercase}.project-card__period{color:var(--ink-2);font-size:.85rem;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:.02em;white-space:nowrap}.page__content .project-card__title,.page__content .course-card__title{margin:0;color:var(--ink);font-size:1.02rem;font-weight:600;letter-spacing:-.012em;line-height:1.3}a.project-card:hover .project-card__title,a.course-card:hover .course-card__title{color:var(--accent)}.page__content .project-card__desc,.page__content .course-card__desc{margin:.25rem 0 0;color:var(--ink-2);font-size:.88rem;line-height:1.55}.software-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1.25rem;margin:.5rem 0 0}.software-card{position:relative;display:flex;flex-direction:column;border:1px solid var(--rule);border-radius:6px;overflow:hidden;background:var(--bg);color:inherit;transition:border-color .14s ease,transform .14s ease,box-shadow .14s ease}.software-card--linked:hover{border-color:var(--ink-3);transform:translateY(-2px);box-shadow:0 .6rem 1.6rem -1rem #0f14192e}.software-card__main-link{color:var(--ink);text-decoration:none}.software-card__main-link:before{content:"";position:absolute;inset:0;z-index:1}.software-card--linked:hover .software-card__main-link{color:var(--accent)}.software-card__media{display:flex;align-items:center;justify-content:center;height:9rem;padding:1.25rem;overflow:hidden;background:var(--bg-soft);border-bottom:1px solid var(--rule)}.software-card__media img{display:block;width:auto;max-width:70%;max-height:100%;object-fit:contain;object-position:center}.software-card__media--placeholder{background:linear-gradient(135deg,#f5f3ee,#fdfdfb)}.software-card__wordmark{font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:1.7rem;font-weight:600;letter-spacing:-.02em;color:var(--ink)}.software-card__body{padding:1.1rem 1.2rem 1.25rem;display:flex;flex-direction:column;gap:.35rem;flex:1}.software-card__header{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.6rem}.page__content .software-card__title{margin:0;color:var(--ink);font-size:1.05rem;font-weight:600;letter-spacing:-.012em;line-height:1.3}.software-card--linked:hover .software-card__title{color:var(--accent)}.software-card__period{color:var(--ink-2);font-size:.85rem;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:.02em;white-space:nowrap}.page__content .software-card__desc{margin:.25rem 0 0;color:var(--ink-2);font-size:.88rem;line-height:1.55}.page__content .software-card__links{position:relative;z-index:2;margin:.5rem 0 0;color:var(--ink-3);font-size:.8rem}.software-card__links a{color:var(--ink-2)}.software-card__links a:hover{color:var(--accent)}.software-data{margin-top:3rem}.software-data__list{list-style:none;margin:0;padding:0}.software-data__list li{display:grid;grid-template-columns:4rem minmax(0,1fr);gap:1.25rem;padding:1rem 0;border-top:1px solid var(--rule);align-items:baseline}.software-data__list li:last-child{border-bottom:1px solid var(--rule)}.software-data__year{color:var(--ink-3);font-size:.85rem;font-variant-numeric:tabular-nums;font-weight:500}.page__content .software-data__entry{color:var(--ink-2);font-size:.92rem;line-height:1.55}.project-section{margin-top:3rem}.project-section:first-of-type{margin-top:1.5rem}.project-section__heading{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin:0 0 .5rem;padding-bottom:.6rem;border-bottom:1px solid var(--rule)}.project-section__heading h2{margin:0!important;color:var(--ink);font-size:1.25rem;font-weight:600;letter-spacing:-.012em}.project-section__heading span{color:var(--ink-3);font-size:.78rem;letter-spacing:.08em;text-transform:uppercase}.project-list{margin:0}.project-item{display:grid;grid-template-columns:7rem minmax(0,1fr);gap:1.5rem;padding:1.4rem 0;border-bottom:1px solid var(--rule);align-items:baseline}.project-item__period{color:var(--ink-3);font-size:.85rem;font-variant-numeric:tabular-nums;font-weight:500;letter-spacing:.01em;line-height:1.5}.project-item--ongoing .project-item__period:before{content:"● ";color:var(--accent);font-size:.55em;vertical-align:.25em;margin-right:.3em}.project-item__body{min-width:0}.page__content .project-item__body h3{margin:0 0 .5rem;color:var(--ink);font-size:1.05rem;font-weight:500;letter-spacing:-.005em;line-height:1.4}.project-meta{display:flex;flex-wrap:wrap;gap:.2rem 1.5rem;margin:0;color:var(--ink-2);font-size:.9rem;line-height:1.55}.project-meta div{min-width:0}.project-meta dt{display:inline;margin-right:.4rem;color:var(--ink-3);font-size:.7rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase}.project-meta dd{display:inline;margin:0;color:var(--ink-2)}.archive__item{margin:1.8rem 0 2.2rem;padding-bottom:1.6rem;border-bottom:1px solid var(--rule)}.archive__item-title{margin-bottom:.35rem;font-size:1.15rem;font-weight:600;letter-spacing:-.01em}.archive__item p{margin-top:.45rem}.archive__item img{display:block;margin-top:.85rem;border:1px solid var(--rule);border-radius:4px}.publication-browser{margin-top:2rem}.publication-toolbar{display:flex;align-items:flex-end;flex-wrap:wrap;gap:1rem 1.5rem;justify-content:space-between;margin-bottom:1.5rem;color:var(--ink-3);font-size:.84rem}.publication-search{display:flex;flex-direction:column;gap:.35rem;flex:1 1 auto;min-width:14rem}.publication-search>span{color:var(--ink-3);font-size:.7rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase}.publication-search input{width:100%;min-height:2.4rem;padding:.45rem .85rem;border:1px solid var(--rule);border-radius:4px;background:var(--bg);color:var(--ink);font:inherit;font-size:.92rem;transition:border-color .12s ease,box-shadow .12s ease}.publication-search input::placeholder{color:var(--ink-3)}.publication-search input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px #1a56db26}.publication-meta{display:flex;flex-direction:column;gap:.15rem;align-items:flex-end;color:var(--ink-3);font-size:.78rem;line-height:1.4}.publication-meta a{color:var(--ink-2)}.publication-last-updated{white-space:nowrap}.publication-filters{display:flex;flex-wrap:wrap;gap:.4rem;flex-basis:100%;margin-top:.4rem}.publication-filters button{min-height:1.95rem;padding:.35rem .85rem;border:1px solid var(--rule);border-radius:999px;background:transparent;color:var(--ink-2);font:inherit;font-size:.8rem;cursor:pointer;transition:background .12s ease,border-color .12s ease,color .12s ease}.publication-filters button:hover{border-color:var(--ink-3);color:var(--ink)}.publication-filters button[aria-pressed=true]{border-color:var(--accent);color:var(--accent);background:#1a56db0f}.publication-table{width:100%;border-collapse:collapse;font-size:.92rem;font-variant-numeric:tabular-nums}.publication-table th,.publication-table td{padding:.85rem .7rem .85rem 0;border-top:1px solid var(--rule);vertical-align:top;text-align:left}.publication-table thead th{border-top:0;border-bottom:1.5px solid var(--ink);padding-bottom:.65rem;color:var(--ink-3);font-size:.7rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase}.publication-table tbody tr{transition:background .1s ease}.publication-table tbody tr:hover{background:var(--bg-soft)}.publication-table th button{display:inline-flex;align-items:center;gap:.3rem;padding:0;border:0;background:transparent;color:inherit;font:inherit;font-weight:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer}.publication-table th button:hover{color:var(--ink)}.publication-table th button[aria-pressed=true]{color:var(--accent)}.publication-table th button[aria-pressed=true]:after{content:"▲";font-size:.55rem}.publication-table th button[aria-pressed=true][data-direction=desc]:after{content:"▼"}.publication-table td{color:var(--ink-2)}.publication-table th:nth-child(1),.publication-table td:nth-child(1){width:2.4rem;color:var(--ink-3);white-space:nowrap}.publication-table th:nth-child(2),.publication-table td:nth-child(2){width:38%}.publication-table td:nth-child(2){color:var(--ink);font-weight:500}.publication-table th:nth-child(3),.publication-table td:nth-child(3){width:4.5rem;color:var(--ink-3);white-space:nowrap}.publication-table th:nth-child(4),.publication-table td:nth-child(4){width:27%;color:var(--ink-2)}.publication-table th:nth-child(5),.publication-table td:nth-child(5){width:21%;color:var(--ink-2);font-style:italic}.publication-table th:nth-child(6),.publication-table td:nth-child(6){width:4.8rem;color:var(--ink-3);text-align:right;white-space:nowrap}.publication-table a{color:var(--ink);text-decoration:underline;text-decoration-color:var(--rule);text-underline-offset:3px}.publication-table a:hover{color:var(--accent);text-decoration-color:var(--accent)}.publication-empty{margin-top:1.5rem;color:var(--ink-3);font-size:.95rem}.page__date{color:var(--ink-3);font-size:.85rem}.page__footer{margin-top:3rem;padding:2.25rem 1.75rem 2.5rem;color:var(--ink-3);border-top:1px solid var(--rule);background:transparent;font-size:.85rem}.page__footer-inner{max-width:var(--max-width-wide);margin:0 auto;display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:.5rem 1.5rem}.page__footer-follow{display:flex;gap:1.25rem}.page__footer a{color:var(--ink-2);text-decoration:none}.page__footer a:hover{color:var(--accent);text-decoration:underline;text-underline-offset:3px}@media(max-width:800px){html{font-size:15.5px}.masthead__inner-wrap{padding:.85rem 1.25rem}.masthead__menu-toggle{display:inline-flex;align-items:center;justify-content:center}.masthead__menu{position:absolute;top:100%;left:0;right:0;flex-direction:column;align-items:stretch;gap:0;padding:.25rem 1.25rem .75rem;background:#fffffff7;backdrop-filter:saturate(160%) blur(8px);-webkit-backdrop-filter:saturate(160%) blur(8px);border-bottom:1px solid var(--rule);box-shadow:0 6px 16px -10px #0f14192e}.masthead__menu[data-open=false]{display:none}.masthead__menu-item{border-top:1px solid var(--rule)}.masthead__menu-item:first-child{border-top:none}.masthead__menu-item a{display:block;padding:.85rem 0;font-size:1rem}.masthead__menu-item a[aria-current=page]:after{display:none}#main{padding:2.5rem 1.25rem 3rem}.intro{grid-template-columns:1fr;gap:1.25rem;margin-bottom:2.6rem;padding-bottom:1.8rem}.intro__photo{width:7.75rem;max-width:100%;margin-top:0}.intro__name{font-size:1.75rem}.page__title{font-size:1.95rem}.featured-publication{grid-template-columns:6.5rem minmax(0,1fr);gap:1rem;padding:1.25rem 0}.paper-preview{max-width:6.5rem}.paper-preview__image,.paper-preview__placeholder{height:9rem}.project-cards,.course-grid,.software-grid{grid-template-columns:1fr;gap:1rem}.software-data__list li{grid-template-columns:1fr;gap:.2rem}.project-item{grid-template-columns:1fr;gap:.4rem}.publication-toolbar{flex-direction:column;align-items:stretch}.publication-meta{align-items:flex-start}.publication-table,.publication-table thead,.publication-table tbody,.publication-table tr,.publication-table td{display:block}.publication-table thead{display:none}.publication-table tr{padding:1rem 0;border-top:1px solid var(--rule)}.publication-table tr:hover{background:transparent}.publication-table td{width:auto!important;padding:.18rem 0;border:0}.publication-table td:before{content:attr(data-label) " · ";color:var(--ink-3);font-size:.7rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase}.publication-table td:nth-child(1):before,.publication-table td:nth-child(2):before{display:none}.publication-table td:nth-child(2){font-size:1.05rem;margin-bottom:.3rem}.page__footer-inner{flex-direction:column;align-items:flex-start}}
