@font-face{font-family:fira sans;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/fira-sans-latin-400-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:fira sans;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/fira-sans-latin-ext-400-normal.woff2)format("woff2");unicode-range:U+100-17F}@font-face{font-family:fira sans;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/fira-sans-latin-400-italic.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:fira sans;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/fira-sans-latin-ext-400-italic.woff2)format("woff2");unicode-range:U+100-17F}@font-face{font-family:fira sans;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/fira-sans-latin-600-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:fira sans;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/fira-sans-latin-ext-600-normal.woff2)format("woff2");unicode-range:U+100-17F}@font-face{font-family:fira code;font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/fira-code-latin-wght-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:fira code;font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/fira-code-latin-ext-wght-normal.woff2)format("woff2");unicode-range:U+100-17F}@font-face{font-family:fira code;font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/fira-code-symbols2-wght-normal.woff2)format("woff2");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:ibm plex sans;font-style:normal;font-weight:100 700;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-ext-wght-normal.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:ibm plex sans;font-style:italic;font-weight:100 700;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-ext-wght-italic.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:ibm plex sans;font-style:normal;font-weight:100 700;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-wght-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:ibm plex sans;font-style:italic;font-weight:100 700;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-wght-italic.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:iosevka;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/iosevka-400-normal.woff2)format("woff2")}@font-face{font-family:iosevka;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/iosevka-400-italic.woff2)format("woff2")}@font-face{font-family:iosevka;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/iosevka-700-normal.woff2)format("woff2")}:root{color-scheme:light dark;--brand-navy:#153054;--brand-green:#24f3a8;--font-sans:"Fira Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono:"Fira Code", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--text-code:0.875em;--text-sm:0.875rem;--text-base:1rem;--text-lg:clamp(1.125rem, 1.05rem + 0.3vw, 1.25rem);--text-xl:clamp(1.25rem, 1.1rem + 0.6vw, 1.5rem);--text-2xl:clamp(1.5rem, 1.25rem + 1vw, 2rem);--text-3xl:clamp(1.875rem, 1.4rem + 2vw, 2.75rem);--leading-tight:1.2;--leading-normal:1.6;--space-1:0.25rem;--space-2:0.5rem;--space-3:0.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:3rem;--space-8:4rem;--gutter:var(--space-4);--measure:42rem;--page-width:64rem;--radius-sm:0.25rem;--radius-md:0.5rem;--radius-full:999px;--border-width:1px;--color-bg:#f7f9fc;--color-surface:#edf1f7;--color-text:#111c2e;--color-muted:#4c5a70;--color-border:#d3dbe7;--color-accent:var(--brand-navy);--color-accent-hover:#2a5796;--color-highlight:var(--brand-green);--color-selection:#c3f8e3;--syntax-keyword:#8a2c5a;--syntax-string:#0b6b4c;--syntax-number:#95480a;--syntax-comment:#566378;--syntax-function:#1f5aa0;--syntax-builtin:#6a3d9a;--syntax-deleted:#b3261e;--syntax-inserted:#0b6b4c;--syntax-line-highlight:#dde5f0}@media(min-width:40rem){:root{--gutter:var(--space-5)}}@media(prefers-color-scheme:dark){:root{--color-bg:#0c1524;--color-surface:#132139;--color-text:#e6ebf2;--color-muted:#9eabbe;--color-border:#24354f;--color-accent:var(--brand-green);--color-accent-hover:#8af8d0;--color-highlight:var(--brand-green);--color-selection:#1d3f63;--syntax-keyword:#ff9dc2;--syntax-string:#24f3a8;--syntax-number:#ffba70;--syntax-comment:#8b9ab0;--syntax-function:#7fb6ff;--syntax-builtin:#c7a9ff;--syntax-deleted:#ff8a80;--syntax-inserted:#24f3a8;--syntax-line-highlight:#1c2d49}}*,*::before,*::after{box-sizing:border-box}body,h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd{margin:0}img,picture,svg,video{display:block;max-width:100%;height:auto}input,button,textarea,select{font:inherit}html{-webkit-text-size-adjust:100%;text-size-adjust:100%;scroll-padding-top:var(--space-5)}@media(prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}body{min-height:100vh;font-family:var(--font-sans);font-size:var(--text-base);line-height:var(--leading-normal);color:var(--color-text);background-color:var(--color-bg);text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;overflow-wrap:break-word}::selection{background-color:var(--color-selection)}h1,h2,h3,h4,h5,h6{line-height:var(--leading-tight);font-weight:600;text-wrap:balance}h1{font-size:var(--text-3xl);letter-spacing:-.02em}h2{font-size:var(--text-2xl);letter-spacing:-.01em}h3{font-size:var(--text-xl)}h4{font-size:var(--text-lg)}h5,h6{font-size:var(--text-base)}p,ul,ol,dl,blockquote,figure,table,pre{margin-block:0 var(--space-4)}:is(p,ul,ol,dl,blockquote,figure,table,pre):last-child{margin-block-end:0}ul,ol{padding-inline-start:var(--space-5)}li+li{margin-block-start:var(--space-1)}strong,b,dt{font-weight:600}small{font-size:var(--text-sm)}hr{margin-block:var(--space-6);border:0;border-block-start:var(--border-width)solid var(--color-border)}blockquote{padding-inline-start:var(--space-4);border-inline-start:.25rem solid var(--color-highlight);color:var(--color-muted);font-style:italic}address{font-style:normal}abbr[title]{text-decoration:underline dotted;cursor:help}a{color:var(--color-accent);text-decoration-thickness:.08em;text-underline-offset:.18em}a:hover{color:var(--color-accent-hover);text-decoration-thickness:.12em}:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px;border-radius:var(--radius-sm)}figure img{border-radius:var(--radius-md)}figcaption{margin-block-start:var(--space-2);font-size:var(--text-sm);color:var(--color-muted);text-align:center}table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse;font-size:var(--text-sm)}th,td{padding:var(--space-2)var(--space-3);border-block-end:var(--border-width)solid var(--color-border);text-align:start;vertical-align:top}th{font-weight:600;border-block-end-width:2px}code,kbd,samp,pre{font-family:var(--font-mono);font-size:var(--text-code);font-variant-ligatures:contextual}:not(pre)>code,kbd{padding:.1em .35em;border-radius:var(--radius-sm);background-color:var(--color-surface);border:var(--border-width)solid var(--color-border);white-space:break-spaces}kbd{border-block-end-width:2px}pre{padding:var(--space-4);overflow-x:auto;line-height:1.5;tab-size:4;background-color:var(--color-surface);border:var(--border-width)solid var(--color-border);border-radius:var(--radius-md)}@media(max-width:39.99rem){pre{margin-inline:calc(var(--gutter) * -1);border-inline:0;border-radius:0}}.highlight{margin-block:0 var(--space-4)}.highlight:last-child{margin-block-end:0}pre code{font-size:inherit}.chroma .line{display:flex}.chroma .hl{display:block;margin-inline:calc(var(--space-4) * -1);padding-inline:var(--space-4);background-color:var(--syntax-line-highlight);box-shadow:inset 3px 0 var(--color-highlight)}.chroma .ln,.chroma .lnt{margin-inline-end:var(--space-3);color:var(--syntax-comment);user-select:none}.chroma .lnlinks{color:inherit;text-decoration:none}.chroma .lntable{border-spacing:0}.chroma .lntd{padding:0;border:0;vertical-align:top}.chroma :is(.k,.kc,.kd,.kn,.kp,.kr,.kt,.ow,.or){color:var(--syntax-keyword)}.chroma :is(.s,.sa,.sb,.sc,.dl,.sd,.s2,.se,.sh,.si,.sx,.sr,.s1,.ss){color:var(--syntax-string)}.chroma :is(.m,.mb,.mf,.mh,.mi,.il,.mo,.no,.na){color:var(--syntax-number)}.chroma :is(.nf,.fm,.nt,.nd){color:var(--syntax-function)}.chroma :is(.nb,.bp,.nc,.nn,.ni,.nl,.vc,.vg,.vi,.vm){color:var(--syntax-builtin)}.chroma :is(.c,.ch,.cm,.c1,.cs,.cp,.cpf){color:var(--syntax-comment);font-style:italic}.chroma :is(.cp,.cpf){font-style:normal}.chroma .gd{color:var(--syntax-deleted)}.chroma .gi{color:var(--syntax-inserted)}.chroma :is(.gh,.gu){color:var(--syntax-function);font-weight:700}.chroma :is(.gp,.go,.gt){color:var(--syntax-comment)}.chroma .ge{font-style:italic}.chroma .gs{font-weight:700}.chroma .gl{text-decoration:underline}.chroma .err{color:var(--syntax-deleted);text-decoration:underline wavy}body{display:flex;flex-direction:column;padding-inline:var(--gutter)}body>header,body>main,body>footer{width:100%;max-width:var(--page-width);margin-inline:auto}body>main{flex:1;padding-block:var(--space-6)var(--space-8)}body>a[href="#main"]{position:absolute;inset-block-start:var(--space-2);inset-inline-start:var(--space-2);z-index:10;padding:var(--space-2)var(--space-4);border-radius:var(--radius-sm);color:var(--color-bg);background-color:var(--color-accent);transform:translateY(-200%)}body>a[href="#main"]:focus{transform:none}body>header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:var(--space-2)var(--space-5);padding-block:var(--space-4);border-block-end:var(--border-width)solid var(--color-border)}body>header>p{font-weight:600;font-size:var(--text-lg)}body>header>p a{color:var(--color-text);text-decoration:none}body>header nav ul{display:flex;flex-wrap:wrap;gap:var(--space-1)var(--space-4);margin:0;padding:0;list-style:none}body>header nav li+li{margin:0}body>header nav a{color:var(--color-muted);text-decoration:none}body>header nav a:hover,body>header nav a[aria-current=page]{color:var(--color-accent)}body>header nav a[aria-current=page]{text-decoration:underline 2px var(--color-highlight)}body>header>nav:first-of-type{order:3;width:100%}body>header>nav+nav{font-family:var(--font-mono);font-size:var(--text-sm)}@media(min-width:40rem){body>header>nav:first-of-type{order:0;width:auto;margin-inline-start:auto}}body>footer{display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--space-2)var(--space-4);padding-block:var(--space-5);border-block-start:var(--border-width)solid var(--color-border);color:var(--color-muted);font-size:var(--text-sm)}body>footer p{margin:0}.h-resume{display:flex;flex-direction:column}.p-contact{display:contents}#contact{order:1}.h-resume>section,#contact,#latest-posts{margin-block-start:var(--space-7)}.h-resume>section>h2,#contact>h2,#latest-posts>h2{margin-block-end:var(--space-5)}.p-skill,.h-item .p-category{display:inline-block;padding:.1em .6em;border:var(--border-width)solid var(--color-border);border-radius:var(--radius-full);background-color:var(--color-bg);font-family:var(--font-mono);font-size:var(--text-sm);color:var(--color-text);text-decoration:none}a.p-skill:hover{border-color:var(--color-accent);color:var(--color-accent)}#technologies ul,.h-item ul{display:flex;flex-wrap:wrap;gap:var(--space-2);padding:0;list-style:none}#technologies li,.h-item li{margin:0}.p-contact>header{display:grid;gap:var(--space-2)var(--space-5);justify-items:start}.p-contact .u-photo{width:7rem;aspect-ratio:1;object-fit:cover;border-radius:var(--radius-full);border:3px solid var(--color-surface);margin-block-end:var(--space-3)}.p-contact .u-photo[src*=logo]{background-color:#fff}.p-contact h1 a{color:inherit;text-decoration:none}.p-job-title{margin:0;font-size:var(--text-lg);color:var(--color-muted)}.p-note{max-width:var(--measure);margin-block-start:var(--space-5);font-size:var(--text-lg)}.p-contact>header ul{display:flex;flex-wrap:wrap;gap:var(--space-2);margin:var(--space-2)0 0;padding:0;list-style:none}.p-contact>header li{margin:0}.p-contact>header ul a{display:grid;place-items:center;width:2.5rem;aspect-ratio:1;border:var(--border-width)solid var(--color-border);border-radius:var(--radius-full);background-color:var(--color-surface);color:var(--color-muted);transition:color .15s,border-color .15s}.p-contact>header ul a:hover{border-color:var(--color-accent);color:var(--color-accent)}.p-contact>header ul a:focus-visible{border-radius:var(--radius-full)}.p-contact>header ul svg{width:1.25rem;height:1.25rem;stroke-width:1.75}@media(min-width:40rem){.p-contact>header{grid-template-columns:auto 1fr;align-content:center;align-items:center}.p-contact>header picture{grid-row:1/span 3}.p-contact .u-photo{width:9rem;margin:0}}#contact h3{margin-block:var(--space-5)var(--space-3);font-size:var(--text-base);color:var(--color-muted)}#contact dl{display:grid;gap:0 var(--space-4)}#contact dt{color:var(--color-muted);font-weight:400;font-size:var(--text-sm)}#contact dd+dt{margin-block-start:var(--space-2)}#contact dl:last-child dd:nth-of-type(n+3){font-variant-numeric:tabular-nums;white-space:nowrap}@media(min-width:40rem){#contact dl{grid-template-columns:max-content 1fr;align-items:baseline}#contact dd+dt{margin:0}}#technologies{display:grid;gap:var(--space-4)}#technologies>h2{margin:0}#technologies>section{padding:var(--space-4)var(--space-5);background-color:var(--color-surface);border-radius:var(--radius-md)}#technologies h3{margin-block-end:var(--space-3);font-size:var(--text-lg)}#technologies h4{margin-block:var(--space-4)var(--space-2);font-size:var(--text-sm);font-weight:400;color:var(--color-muted);text-transform:uppercase;letter-spacing:.06em}#technologies h3+h4{margin-block-start:0}@media(min-width:40rem){#technologies{grid-template-columns:repeat(auto-fill,minmax(18rem,1fr))}#technologies>h2{grid-column:1/-1}}#projects>ul,#clients>ul{display:grid;gap:var(--space-4);padding:0;list-style:none}#projects>ul>li,#clients>ul>li{margin:0}.h-item{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-4)var(--space-5);border:var(--border-width)solid var(--color-border);border-radius:var(--radius-md)}.h-item h3{font-family:var(--font-mono);font-size:var(--text-lg)}.h-item .p-summary{flex:1;margin:0;color:var(--color-muted)}.p-affiliation .p-role{color:var(--color-muted)}@media(min-width:40rem){#projects>ul{grid-template-columns:repeat(auto-fill,minmax(18rem,1fr))}}.h-feed>header{max-width:var(--measure);margin-block-end:var(--space-6)}.h-feed>header .p-summary{margin-block-start:var(--space-3);font-size:var(--text-lg);color:var(--color-muted)}.h-feed .h-entry{max-width:var(--measure);padding-block:var(--space-4);border-block-end:var(--border-width)solid var(--color-border)}.h-feed .h-entry:first-of-type{padding-block-start:0}.h-feed .h-entry .p-name{font-size:var(--text-xl)}.h-feed .h-entry .p-name a{color:var(--color-text);text-decoration:none}.h-feed .h-entry .p-name a:hover{color:var(--color-accent)}.h-feed .h-entry time{font-family:var(--font-mono);font-size:var(--text-sm);color:var(--color-muted)}.h-feed .h-entry>p{margin-block:var(--space-1)var(--space-2)}main>.h-entry{max-width:var(--measure);margin-inline:auto}main>.h-entry>header{margin-block-end:var(--space-6)}main>.h-entry>header h1{margin-block-end:var(--space-3)}main>.h-entry>header p{font-size:var(--text-sm);color:var(--color-muted)}main>.h-entry>header a{color:inherit}.e-content{font-size:var(--text-lg)}.e-content :is(h2,h3,h4){margin-block:var(--space-6)var(--space-3)}.e-content figure{margin-block:var(--space-6)}.e-content pre{font-size:var(--text-sm)}main>.h-entry>footer{margin-block-start:var(--space-7);padding-block-start:var(--space-4);border-block-start:var(--border-width)solid var(--color-border)}main>.h-entry>footer h2{margin-block-end:var(--space-2);font-size:var(--text-sm);font-weight:400;color:var(--color-muted)}main>.h-entry>footer ul,main>section:not(.h-feed) ul{display:flex;flex-wrap:wrap;gap:var(--space-2);padding:0;list-style:none}main>.h-entry>footer li,main>section:not(.h-feed) li{margin:0}.p-category[rel=tag],a[rel=tag]{font-family:var(--font-mono);font-size:var(--text-sm)}.p-category[rel=tag]::before,a[rel=tag]::before{content:"#"}.h-feed>nav ul{display:flex;justify-content:space-between;margin-block-start:var(--space-6);padding:0;list-style:none}.h-feed>nav li:has(a[rel=next]){margin-inline-start:auto}