:root{--paper: #f5f4ed;--edge: #dedbcf;--rule: #141413;--code: #ecebe3;--accent: #1b365d;--accent-soft: color-mix(in srgb, var(--accent) 35%, transparent);--ink: #141413;--body: #2f2f2c;--muted: #6b6a64;--serif: Charter, "Bitstream Charter", "Charis SIL", Georgia, Palatino, serif;--mono: "JetBrains Mono", "SF Mono", ui-monospace, Menlo, monospace;color-scheme:light}@media (prefers-color-scheme: dark){:root:not(.light){--paper: #141413;--edge: #33332f;--rule: #d6d4ca;--code: #22221f;--accent: #9db8dc;--ink: #f5f4ed;--body: #d6d4ca;--muted: #8f8c82;color-scheme:dark}}.dark{--paper: #141413;--edge: #33332f;--rule: #d6d4ca;--code: #22221f;--accent: #9db8dc;--ink: #f5f4ed;--body: #d6d4ca;--muted: #8f8c82;color-scheme:dark}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--paper);color:var(--body);font-family:var(--serif);font-size:17px;line-height:1.6;font-feature-settings:"kern","liga","onum";-webkit-font-smoothing:antialiased}::selection{background:color-mix(in srgb,var(--accent) 18%,transparent)}.paper{position:relative;padding:72px 16px 56px}.sheet{max-width:880px;margin:0 auto;counter-reset:figure}a{color:var(--accent);text-decoration:underline;text-decoration-color:var(--accent-soft);text-underline-offset:3px}a:hover{text-decoration-color:currentColor}a:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:2px}strong{color:var(--ink);font-weight:700}code{font-family:var(--mono);font-size:.8em;background:var(--code);padding:1px 4px;border-radius:3px}.header-anchor{display:none}.title-block{text-align:center;margin-bottom:36px}.title-block h1{margin:0;font-size:38px;font-weight:400;line-height:1.15;letter-spacing:-.4px;color:var(--ink)}.title-block .affil{margin:14px 0 0;font-style:italic;color:var(--body)}.title-block .contact{margin:6px 0 0;font-size:15px;color:var(--muted)}.title-block .contact a+a:before,.title-block .contact span+a:before{content:"·";display:inline-block;margin:0 .55em;color:var(--muted)}.title-block .date{margin:14px 0 0;font-size:15px;color:var(--muted)}.contents{display:flex;justify-content:center;flex-wrap:wrap;gap:4px 22px;margin:0 0 32px;padding:10px 0;border-top:1px solid var(--edge);border-bottom:1px solid var(--edge);font-size:15px;font-variant:small-caps;letter-spacing:.04em}.contents a{text-decoration:none}.contents b{font-weight:400;color:var(--muted);margin-right:.35em;font-variant-numeric:lining-nums}.abstract{margin:0 auto 8px;max-width:560px;font-size:15.5px}.abstract .abstract-title{text-align:center!important;font-weight:700;margin:0 0 6px;color:var(--ink)}.abstract p{margin:0;text-align:justify;-webkit-hyphens:auto;hyphens:auto}.sheet h2{margin:56px 0 16px;padding-top:14px;border-top:1px solid var(--edge);font-size:13px;font-weight:600;letter-spacing:.14em;line-height:1.4;text-transform:uppercase;color:var(--muted)}.sheet p{margin:0;text-align:justify;-webkit-hyphens:auto;hyphens:auto}.sheet h2+p,.sheet h3+p{text-indent:0}.sheet p+p{text-indent:1.5em}.sheet ul{margin:10px 0;padding-left:1.4em}.sheet li{margin:4px 0}.sheet li::marker{color:var(--muted)}figure{counter-increment:figure;margin:26px auto;text-align:center}figure img{display:block;width:100%;aspect-ratio:16 / 10;object-fit:cover;object-position:50% 60%;border-radius:12px;box-shadow:0 0 0 1px var(--edge)}.theme-toggle{position:absolute;top:28px;right:28px;display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--edge);border-radius:50%;background:transparent;color:var(--muted);cursor:pointer}.theme-toggle:hover{color:var(--ink)}.theme-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.theme-toggle svg{width:17px;height:17px}@media print{.theme-toggle{display:none}}figcaption{margin:12px 0 0;font-size:15px;text-align:left;color:var(--muted)}figcaption:before{content:"Figure " counter(figure) ": ";font-weight:700;color:var(--ink)}.news{display:grid;grid-template-columns:6.2em minmax(0,1fr);gap:8px 16px;margin:12px 0 0}.news dt{font-variant:small-caps;letter-spacing:.03em;color:var(--muted);font-variant-numeric:lining-nums}.news dd{margin:0;text-align:justify;-webkit-hyphens:auto;hyphens:auto}.table{margin:18px 0 8px;overflow-x:auto}table{width:100%;border-collapse:collapse;font-size:15.5px;font-variant-numeric:lining-nums tabular-nums}caption{caption-side:top;text-align:left;font-size:15px;margin-bottom:8px}caption b{color:var(--ink)}thead tr{border-top:1.5px solid var(--rule);border-bottom:.75px solid var(--rule)}tbody tr:last-child{border-bottom:1.5px solid var(--rule)}th{text-align:left;font-weight:700;color:var(--ink);padding:6px 10px 5px 0}td{vertical-align:top;padding:5px 10px 5px 0}td:first-child{white-space:nowrap;color:var(--muted)}td em{color:var(--muted)}tr.gap td{padding-top:12px}.projects{list-style:none;padding:0!important;margin:14px 0 0!important}.projects li{margin:0 0 16px!important}.projects .p-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 10px}.projects .p-title{font-weight:700;color:var(--ink)}.projects .tag{font-size:14px;font-variant:small-caps;letter-spacing:.04em;color:var(--muted)}.projects .p-body{margin:2px 0 0;text-align:justify;-webkit-hyphens:auto;hyphens:auto}.projects .refs{font-size:15px}.projects .refs a{text-decoration:none}.projects .refs a:before{content:"[";color:var(--muted)}.projects .refs a:after{content:"]";color:var(--muted)}.projects .refs a+a{margin-left:6px}.footnote{margin-top:48px}.footnote:before{content:"";display:block;width:38%;margin-bottom:8px;border-top:.75px solid var(--rule)}.footnote p{font-size:13.5px;line-height:1.5;text-align:left;color:var(--muted)}.folio{margin-top:40px;text-align:center!important;text-indent:0!important;font-size:14px;color:var(--muted);font-variant-numeric:lining-nums}@media (max-width: 640px){body{font-size:16px}.paper{padding-top:40px}.title-block h1{font-size:32px}.sheet p,.news dd,.projects .p-body,.abstract p{text-align:left}.news{grid-template-columns:1fr;gap:0}.news dd{margin-bottom:10px}}@media print{:root{--paper: #fff}.paper{padding:0}.contents{display:none}a{text-decoration:none}}.sheet .title-block p,.sheet .folio{text-align:center;text-indent:0}.sheet .abstract p{text-indent:0}.sheet .abstract .abstract-title{text-align:center}.job{display:grid;grid-template-columns:220px minmax(0,1fr);column-gap:40px;padding:22px 0 30px;border-top:1px solid var(--edge)}.sheet h2+.job{border-top:0;padding-top:6px}.job>.job-head{grid-column:1;grid-row:1 / span 60;position:sticky;top:24px;align-self:start;display:flex;flex-direction:column;gap:3px}.job>:not(.job-head){grid-column:2}.job h3{margin:0;font-size:22px;font-weight:400;line-height:1.25;letter-spacing:-.2px;color:var(--ink)}.job .role{font-size:15.5px;color:var(--body)}.job .dates{font-size:14.5px;color:var(--muted);font-variant-numeric:lining-nums}.job .blurb{margin-top:10px}.sheet .job .blurb p{font-size:14.5px;line-height:1.5;font-style:italic;text-align:left;text-indent:0;color:var(--muted)}.job .blurb a{font-style:normal;white-space:nowrap}.job ul{margin:0!important;padding-left:1.1em!important}.job li{margin:0 0 10px!important;font-size:16px;line-height:1.6}.job .logo{width:40px;height:40px;border-radius:9px;margin-bottom:10px;object-fit:contain;background:#fff;box-shadow:0 0 0 1px var(--edge)}.job .logo-mono{display:inline-flex;align-items:center;justify-content:center;background:var(--paper);color:var(--muted);font-size:19px;font-style:italic;line-height:1}.job .thumb{display:block;width:100%;aspect-ratio:16 / 9;object-fit:cover;border-radius:10px;box-shadow:0 0 0 1px var(--edge);margin-top:14px}.sheet .job .job-head .refs{margin:8px 0 0;font-size:14.5px;text-indent:0;text-align:left}.job-head .refs a{text-decoration:none;white-space:nowrap}.job-head .refs a:before{content:"[";color:var(--muted)}.job-head .refs a:after{content:"]";color:var(--muted)}.job-head .refs a+a{margin-left:6px}.sheet .job-body p{margin:0 0 10px;text-indent:0;font-size:16px;line-height:1.6}.sheet .job-body p.lead{font-size:18px;line-height:1.4;color:var(--ink);text-align:left}.job .stack{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}.job .stack .si{width:16px;height:16px;flex:none;background:var(--muted);-webkit-mask:var(--si) center / contain no-repeat;mask:var(--si) center / contain no-repeat;transition:background-color .15s}.job .stack .si:hover{background:var(--brand)}details.group{border-top:1px solid var(--edge)}.job>ul+details.group{margin-top:18px}details.group:last-child{border-bottom:1px solid var(--edge)}details.group summary{display:flex;justify-content:space-between;align-items:baseline;padding:13px 0;cursor:pointer;list-style:none;font-size:17px;color:var(--accent)}details.group summary::-webkit-details-marker{display:none}details.group summary:after{content:"+";font-family:var(--mono);font-size:15px;color:var(--muted)}details.group[open] summary:after{content:"–"}details.group summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:2px}.group-body{padding:0 0 14px}.sheet .cv-note{margin-top:8px;font-size:15px;color:var(--muted);text-indent:0}@media (max-width: 760px){.job{display:block}.job>.job-head{position:static;margin-bottom:14px}}@media print{details.group>.group-body{display:block!important}.job>.job-head{position:static}}details.contracts{border-top:1px solid var(--edge)}details.contracts>summary{display:flex;justify-content:space-between;align-items:baseline;padding:18px 0;cursor:pointer;list-style:none;font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}details.contracts>summary::-webkit-details-marker{display:none}details.contracts>summary:after{content:"show +";font-family:var(--mono);font-size:12px;letter-spacing:0;text-transform:none}details.contracts[open]>summary:after{content:"hide –"}details.contracts>summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px}@media print{details.contracts>.job{display:grid!important}}.sheet>h2:first-child{margin-top:0}.job.profile h1{margin:0;font-size:30px;font-weight:400;line-height:1.2;letter-spacing:-.3px;color:var(--ink);text-align:left}.job.profile .portrait{margin:18px 0 0}.job.profile .portrait img{aspect-ratio:4 / 3;object-position:50% 55%}.job.profile .portrait figcaption{margin-top:8px;font-size:13px;line-height:1.45}.job.profile .portrait figcaption:before{content:none}.job.profile .job-body ul{margin-top:6px!important}
