@font-face{font-family:NewRodin;src:url(/fonts/newrodin-latin.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Skip;src:url(/fonts/skip-latin.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Mono;src:url(/fonts/jetbrains-mono-latin.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}:root{--paper:#f2f0e8;--ink:#161410;--soft:#433d2e;--accent:#2f6fff;--line:#16141012;--font-display:"NewRodin", system-ui, sans-serif;--font-body:"Skip", system-ui, sans-serif;--font-label:"Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--font-code:"Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--step--2:.55rem;--step--1:.7rem;--step-0:.95rem;--step-1:1.1rem;--step-2:1.35rem;--step-3:clamp(3rem, 7vw, 5rem);--space-2:.5rem;--space-3:1rem;--space-4:1.5rem;--space-5:2.5rem;--measure:62ch;--measure-wide:74ch;--measure-entry:82ch;--shell-max:1200px}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{font-variant-east-asian:proportional-width;font-family:var(--font-body);color:var(--soft);background:var(--paper);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:15px;line-height:1.6}ul{list-style:none}a{color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}.shell{z-index:1;max-width:var(--shell-max);margin-inline:auto;padding:8vh 6vw;position:relative}.section{margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--line)}.section__summary{cursor:pointer;align-items:center;gap:.7rem;width:fit-content;padding-block:.35rem;list-style:none;display:flex}.section__summary::-webkit-details-marker{display:none}.section[open] .section__summary{margin-bottom:1.2rem}.section-label{font-family:var(--font-label);font-size:var(--step--2);letter-spacing:.22em;text-transform:uppercase;color:var(--ink)}.section__marker{flex:none;width:.5rem;height:.5rem;position:relative}.section__marker:before,.section__marker:after{content:"";background:var(--soft);transform-origin:50%;width:100%;height:1px;transition:transform .24s cubic-bezier(.4,0,.2,1);position:absolute;top:calc(50% - .5px);left:0}.section__marker:after{transform:rotate(90deg)}details[open] .section__marker:after{transform:rotate(0)}.entry-title{font-family:var(--font-display);font-weight:400;font-size:var(--step-1);letter-spacing:-.02em;color:var(--ink);max-width:var(--measure-entry);line-height:1.25}.meta{overflow-wrap:break-word;font-family:var(--font-label);font-size:var(--step--1);letter-spacing:.05em;color:var(--ink)}.meta__sep{color:var(--soft);padding-inline:.4em}.link-ruled{border-bottom:1px solid var(--line);padding-bottom:1px;text-decoration:none;transition:border-color .2s}.link-ruled:hover{border-bottom-color:var(--accent)}.backlink{font-family:var(--font-label);font-size:var(--step--2);letter-spacing:.22em;text-transform:uppercase;color:var(--ink);display:inline-block}.article__head{margin:var(--space-5) 0 var(--space-4);padding-bottom:var(--space-4);border-bottom:1px solid var(--line)}.article__title{font-family:var(--font-display);letter-spacing:-.035em;color:var(--ink);max-width:22ch;margin-bottom:.6rem;font-size:clamp(1.9rem,4.2vw,3rem);font-weight:400;line-height:1.05}.backdrop{z-index:0;pointer-events:none;filter:saturate(1.2)brightness(1.1);width:100%;height:100lvh;display:block;position:fixed;top:0;left:0}.masthead{justify-content:space-between;align-items:flex-start;gap:var(--space-5);display:flex}.masthead__intro{min-width:0}.portrait{cursor:pointer;-webkit-tap-highlight-color:transparent;aspect-ratio:1;border:1px solid var(--line);background:var(--paper);flex:none;width:clamp(7rem,12vw,11rem);position:relative;overflow:hidden}.portrait img{object-fit:cover;width:100%;height:100%;display:block;position:absolute;inset:0}.portrait__cycle img{animation:15s infinite portrait-cycle}.portrait__cycle img:nth-child(2){animation-delay:-10s}.portrait__cycle img:nth-child(3){animation-delay:-5s}@keyframes portrait-cycle{0%{opacity:1}30%{opacity:1}36%{opacity:0}94%{opacity:0}to{opacity:1}}.portrait__hover{opacity:0;transition:opacity .35s}.portrait:hover .portrait__hover,.portrait:focus-within .portrait__hover,.portrait--revealed .portrait__hover{opacity:1}.masthead__name{font-family:var(--font-display);font-weight:400;font-size:var(--step-3);letter-spacing:-.05em;color:var(--ink);margin-bottom:.35rem;line-height:.92}.masthead__tagline{font-size:var(--step-1);color:var(--soft);letter-spacing:.01em;max-width:var(--measure);margin-top:var(--space-3);line-height:1.35}.masthead__tagline span{display:block}.contact{gap:var(--space-5);margin-top:var(--space-3);font-family:var(--font-label);letter-spacing:.03em;flex-wrap:wrap;font-size:.75rem;display:flex}.contact a{color:var(--ink)}.profile{font-family:var(--font-body);color:var(--ink);letter-spacing:.01em;max-width:var(--measure-wide);font-size:1.2rem;line-height:1.45}.profile p+p{margin-top:1em}.skills{max-width:var(--measure-entry);grid-template-columns:max-content 1fr;align-items:baseline;gap:.7rem 2rem;display:grid}.skills dt{font-family:var(--font-label);font-size:var(--step--1);letter-spacing:.14em;text-transform:uppercase;color:var(--soft);white-space:nowrap}.skills dd{overflow-wrap:break-word;font-family:var(--font-label);font-size:var(--step-0);letter-spacing:.02em;color:var(--ink);line-height:1.6}.achievements{overflow-wrap:break-word;font-family:var(--font-label);color:var(--ink);max-width:var(--measure-wide);letter-spacing:.02em;font-size:1rem;line-height:1.7}.achievements li+li{margin-top:var(--space-2)}.achievements a{color:inherit}.project{padding-bottom:var(--space-4);border-bottom:1px solid var(--line)}.project+.project{margin-top:var(--space-5)}.project:last-child{border-bottom:none;padding-bottom:0}.project__name{font-family:var(--font-display);font-weight:400;font-size:var(--step-2);letter-spacing:-.03em;color:var(--ink);margin-bottom:.45rem;line-height:1.1}.project__body{color:var(--ink);max-width:var(--measure-entry);font-size:1rem;line-height:1.55}.project__body p+p{margin-top:.4rem}.project__stack{letter-spacing:.06em;margin-top:.55rem}.role+.role{margin-top:var(--space-5)}.role__head{margin-bottom:var(--space-2);gap:.3rem;display:grid}.role__body{font-size:var(--step-0);color:var(--ink);max-width:var(--measure-entry);line-height:1.6}.role__bullets{gap:.55rem;display:grid}.role__bullet{font-size:var(--step-0);color:var(--ink);max-width:var(--measure-entry);padding-left:1.15rem;line-height:1.55;position:relative}.role__bullet:before{content:"";background:var(--soft);width:.55rem;height:1px;position:absolute;top:.72em;left:0}.publication+.publication{margin-top:var(--space-3)}.degree+.degree{margin-top:var(--space-4)}.publication__title,.degree__title{margin-bottom:.15rem}.degree__meta{margin-bottom:.25rem}.degree__note{font-size:var(--step-0);color:var(--ink);max-width:var(--measure-entry);line-height:1.55}.degree__focus,.degree__coursework{display:block}.colophon{margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--line);justify-content:flex-end;align-items:flex-end;gap:var(--space-3);color:var(--ink);flex-wrap:wrap;font-size:.75rem;display:flex}@media (width<=640px){.shell{padding:6vh 5vw}.masthead{gap:0 var(--space-3);grid-template-columns:minmax(0,1fr) auto;align-items:start;display:grid}.masthead__intro{display:contents}.masthead__name{grid-area:1/1}.masthead__tagline{grid-area:2/1}.contact{grid-area:3/1/auto/-1}.masthead__name{font-size:2.35rem}.portrait{grid-area:1/2/3;align-self:start;width:clamp(4.5rem,24vw,6.5rem);margin-top:-.4rem}.section{margin-top:var(--space-3);padding-top:var(--space-3)}.section[open] .section__summary{margin-bottom:var(--space-3)}.contact{gap:var(--space-3) var(--space-4)}.project+.project{margin-top:var(--space-4)}.masthead__tagline{font-size:1rem}.profile{font-size:1.05rem}.skills{grid-template-columns:1fr;row-gap:.2rem}.skills dd{font-size:var(--step--1);margin-bottom:.7rem}.achievements{font-size:.85rem}.project__body,.role__body,.role__bullet,.degree__note{font-size:.9rem}.colophon{margin-top:var(--space-3)}.project__name{font-size:1.15rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}.portrait__cycle img{opacity:0;animation:none!important}.portrait__cycle img:first-child{opacity:1}}
