:root{--paper:#f7f8fa;--grid:#e3e8ee;--ink:#10161f;--ink-soft:#3d4654;--ink-muted:#69727f;--ink-faint:#98a0ac;--rule:#10161f;--rule-soft:#d4dae2;--trace:#1c5bd8;--pen:#c22f2f;--font-mono:"Spline Sans Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--font-serif:"Newsreader", "Georgia", "Times New Roman", serif;--font-display:"Archivo", "Helvetica Neue", Arial, sans-serif;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--space-7:48px;--space-8:64px;--space-9:96px;--measure:72ch;--col-date:11ch}*,:before,:after{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--paper);color:var(--ink);font-family:var(--font-serif);-webkit-font-smoothing:antialiased;font-feature-settings:"kern";background-image:linear-gradient(var(--grid) 1px, transparent 1px), linear-gradient(90deg, var(--grid) 1px, transparent 1px);background-position:50% 0;background-size:28px 28px;min-height:100vh;font-size:16px;line-height:1.55}a{color:inherit;text-decoration:underline;-webkit-text-decoration-color:var(--ink-faint);text-decoration-color:var(--ink-faint);text-underline-offset:3px;transition:color .12s,text-decoration-color .12s}a:hover{color:var(--trace);-webkit-text-decoration-color:var(--trace);text-decoration-color:var(--trace)}:focus-visible{outline:2px solid var(--trace);outline-offset:2px}h1,h2,h3,h4,h5,h6{margin:0;font-weight:500}p{margin:0}ul,ol{margin:0;padding:0;list-style:none}.page{max-width:880px;padding:var(--space-6) var(--space-6) var(--space-8);background:var(--paper);border-left:1px solid var(--grid);border-right:1px solid var(--grid);min-height:100vh;margin:0 auto;position:relative}.header{margin-bottom:var(--space-8)}.header .name{font-family:var(--font-display);font-variation-settings:"wdth" 118;letter-spacing:.005em;text-transform:uppercase;color:var(--ink);font-size:clamp(2.5rem,6.4vw,4.1rem);font-weight:800;line-height:.98}.header .tagline{font-family:var(--font-mono);color:var(--ink-soft);margin-top:var(--space-3);letter-spacing:.03em;font-size:.92rem}.header .summary{margin-top:var(--space-5);max-width:60ch;color:var(--ink-soft);font-variation-settings:"opsz" 18;font-size:1.06rem;line-height:1.6}.pen-mark{background-image:linear-gradient(#c22f2f24,#c22f2f24);background-position:0 78%;background-repeat:no-repeat;background-size:0% 68%;animation:.7s cubic-bezier(.6,0,.3,1) 1.5s forwards pen-in}@keyframes pen-in{to{background-size:100% 68%}}.contact{margin-top:var(--space-5);gap:var(--space-2) var(--space-4);font-family:var(--font-mono);color:var(--ink-muted);flex-wrap:wrap;font-size:.8rem;display:flex}.contact .dot{color:var(--ink-faint)}.contact a{border-bottom:1px solid var(--rule-soft);text-decoration:none}.contact a:hover{border-bottom-color:var(--trace);color:var(--trace)}.marker{align-items:baseline;gap:var(--space-3);margin-top:var(--space-8);margin-bottom:var(--space-4);font-family:var(--font-display);font-variation-settings:"wdth" 116;letter-spacing:.16em;text-transform:uppercase;color:var(--ink);font-size:.86rem;font-weight:700;display:flex}.marker .glyphs{display:inline-flex}.marker .glyph{opacity:0;transition:opacity .22s,transform .3s cubic-bezier(.22,1,.36,1);transform:translateY(.3em)}.marker.inview .glyph{opacity:1;transform:translateY(0)}.marker .rule{background:var(--rule);transform-origin:0;flex:1;height:1px;transition:transform .64s cubic-bezier(.22,1,.36,1) .18s;position:relative;transform:scaleX(0)}.marker .rule:after{content:"";background:var(--rule);width:1px;height:7px;position:absolute;bottom:0;right:0}.marker.inview .rule{transform:scaleX(1)}.entry{grid-template-columns:var(--col-date) 1fr;column-gap:var(--space-5);display:grid}.entry .when{font-family:var(--font-mono);color:var(--ink-muted);padding-top:calc(var(--space-4) + .36em);letter-spacing:.02em;text-align:right;font-size:.76rem}.entry:first-of-type .when{padding-top:calc(var(--space-2) + .36em)}.entry .body{border-left:1px solid var(--rule-soft);padding:var(--space-4) 0 var(--space-4) var(--space-5);position:relative}.entry:first-of-type .body{padding-top:var(--space-2)}.entry:last-of-type .body{padding-bottom:var(--space-5)}.entry .body:before{content:"";left:0;top:calc(var(--space-4) + .68em);background:var(--trace);width:10px;height:1px;position:absolute}.entry:first-of-type .body:before{top:calc(var(--space-2) + .68em)}.entry .body h3{font-family:var(--font-display);font-variation-settings:"wdth" 108;letter-spacing:.01em;color:var(--ink);font-size:1.06rem;font-weight:700}.project-title-link{color:inherit;border-bottom:1px solid var(--trace);text-decoration:none;transition:color .16s,border-color .16s}.project-title-link:hover{color:var(--trace);border-bottom-color:currentColor}.project-title-link:focus-visible{outline:2px solid var(--trace);outline-offset:3px}.entry-title-row .when-right{display:none}.dates-right .entry{display:block}.dates-right .entry>.when-left{display:none}.dates-right .entry-title-row{justify-content:space-between;align-items:baseline;gap:var(--space-3);display:flex}.dates-right .entry-title-row .when-right{text-align:right;white-space:nowrap;flex:none;padding:0;display:block}.dates-right .entry .body{border-left:none;padding-left:0}.dates-right .entry .body:before{content:none}.entry .body .sub{font-family:var(--font-mono);color:var(--ink-muted);letter-spacing:.01em;margin-top:.22em;font-size:.78rem}.entry .body ul{margin-top:var(--space-3)}.entry .body li{color:var(--ink-soft);margin-top:.5em;padding-left:1.5ch;font-size:.99rem;line-height:1.58;position:relative}.entry .body li:before{content:"–";color:var(--trace);font-weight:600;position:absolute;top:0;left:0}.project-stack{gap:0 var(--space-2);font-family:var(--font-mono);color:var(--ink-muted);letter-spacing:.04em;text-transform:uppercase;flex-wrap:wrap;margin-top:.35em;font-size:.7rem;display:flex}.project-stack .chip+.chip:before{content:"·";color:var(--ink-faint);margin:0 .45em}.entry .body .sub .sub-sep{color:var(--ink-faint);margin:0 .45em}.project-index{font-family:var(--font-mono);color:var(--trace);letter-spacing:.08em;margin-bottom:.15em;font-size:.72rem}.awards-grid{grid-template-columns:var(--col-date) 1fr;column-gap:var(--space-5);margin-top:var(--space-2);row-gap:0;display:grid}.awards-grid .aw-row,.skills-grid .sk-row{display:contents}.awards-grid .aw-year{font-family:var(--font-mono);color:var(--ink-muted);padding-top:calc(var(--space-3) + .2em);text-align:right;font-size:.76rem}.awards-grid .aw-body{border-left:1px solid var(--rule-soft);padding:var(--space-3) 0 var(--space-3) var(--space-5);position:relative}.awards-grid .aw-body:before{content:"";left:0;top:calc(var(--space-3) + .55em);background:var(--trace);width:10px;height:1px;position:absolute}.awards-grid .award-name{font-family:var(--font-serif);color:var(--ink);font-size:1rem;font-weight:400}.awards-grid .award-detail{font-family:var(--font-serif);color:var(--ink-muted);font-size:.92rem;font-style:italic}.awards-grid .award-detail-group{margin-left:.35em}.awards-grid .award-separator{color:var(--ink-muted)}.aw-title-row .aw-year-right{display:none}.dates-right .awards-grid,.dates-right .awards-grid .aw-row{display:block}.dates-right .awards-grid .aw-year-left{display:none}.dates-right .awards-grid .aw-body{border-left:none;padding-left:0}.dates-right .awards-grid .aw-body:before{content:none}.dates-right .aw-title-row{justify-content:space-between;align-items:baseline;gap:var(--space-3);display:flex}.dates-right .aw-title-row .aw-year-right{text-align:right;white-space:nowrap;flex:none;padding:0;display:block}.skills-grid{grid-template-columns:var(--col-date) 1fr;column-gap:var(--space-5);row-gap:var(--space-3);margin-top:var(--space-2);display:grid}.skills-grid .sk-label{font-family:var(--font-mono);color:var(--ink-muted);letter-spacing:.06em;text-transform:uppercase;text-align:right;padding-top:.2em;font-size:.76rem}.skills-grid .sk-list{font-family:var(--font-serif);color:var(--ink-soft);font-size:.98rem;line-height:1.55}.skills-grid .sk-list .sep{color:var(--ink-faint);margin:0 .45em}.contact a,.sk-list{overflow-wrap:anywhere}.entry>*,.aw-row>*,.sk-row>*{min-width:0}.lead-entry{margin-top:var(--space-4)}.lead-entry .row{justify-content:space-between;align-items:baseline;gap:var(--space-3);display:flex}.lead-entry .row strong{font-family:var(--font-display);font-variation-settings:"wdth" 108;font-size:1rem;font-weight:700}.lead-entry .row .when{font-family:var(--font-mono);color:var(--ink-muted);font-size:.76rem}.lead-entry .role{font-family:var(--font-mono);color:var(--ink-muted);letter-spacing:.01em;margin-top:.1em;font-size:.78rem}.lead-entry p{color:var(--ink-soft);margin-top:.35em;font-size:.99rem;line-height:1.58}body.spotlight-on [data-spot]{transition:filter .3s}body.spotlight-on [data-spot]:not([data-focused]):not(:hover):not(:focus-within){filter:opacity(.35)}.reveal{opacity:0;transition:opacity .52s cubic-bezier(.22,1,.36,1),transform .52s cubic-bezier(.22,1,.36,1);transform:translateY(14px)}.reveal.inview{opacity:1;transform:translateY(0)}.reveal.delay-1{transition-delay:60ms}.reveal.delay-2{transition-delay:.12s}.reveal.delay-3{transition-delay:.18s}.print-btn{bottom:var(--space-5);right:var(--space-5);background:var(--paper);color:var(--ink);font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--ink);cursor:pointer;box-shadow:3px 3px 0 var(--trace);z-index:40;padding:10px 16px 9px;font-size:.74rem;text-decoration:none;transition:box-shadow .16s,transform .16s;display:inline-block;position:fixed}.print-btn:hover{box-shadow:4px 4px 0 var(--trace);transform:translate(-1px,-1px)}.print-btn:active{box-shadow:2px 2px 0 var(--trace);transform:translate(1px,1px)}.print-btn .arrow{color:var(--trace);margin-left:6px}.footer{margin-top:var(--space-9);padding-top:var(--space-4);border-top:1px solid var(--rule);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted);justify-content:space-between;gap:var(--space-4);font-size:.7rem;display:flex}@media screen and (width<=640px){.page{padding:var(--space-5) var(--space-4) var(--space-6);border-left:none;border-right:none}.entry,.awards-grid,.skills-grid{grid-template-columns:1fr}.entry .when,.awards-grid .aw-year,.skills-grid .sk-label{text-align:left;padding-top:var(--space-3);margin-bottom:0}.entry:first-of-type .when{padding-top:var(--space-2)}.entry .body,.awards-grid .aw-body{padding-left:0;padding-top:var(--space-1);border-left:none}.entry .body:before,.awards-grid .aw-body:before{content:none}.skills-grid{row-gap:var(--space-1)}.skills-grid .sk-label{padding-top:var(--space-3)}.print-btn{bottom:var(--space-4);right:var(--space-4);padding:8px 12px 7px;font-size:.68rem}.footer{gap:var(--space-1);flex-direction:column}.header .name{font-size:clamp(2.2rem,9vw,2.6rem)}.marker{flex-wrap:wrap}.marker .rule{min-width:32px}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:0s!important;animation-duration:0s!important}.reveal{opacity:1;transform:none}.marker .rule{transform:scaleX(1)}.marker .glyph{opacity:1;transform:none}.pen-mark{background-size:100% 68%;animation:none}}@page{size:A4;margin:14mm}@media print{:root{--print-font-scale:1;--print-leading-scale:1}html,body{font-size:calc(10.7pt * var(--print-font-scale));line-height:calc(1.4 * var(--print-leading-scale));-webkit-print-color-adjust:economy;print-color-adjust:economy;color:#000!important;background:#fff!important}.print-btn,.cursor,.footer{display:none!important}.pen-mark{color:inherit!important;background:0 0!important;animation:none!important}.reveal,[data-spot],.marker .glyph,.marker .rule{opacity:1!important;filter:none!important;transition:none!important;animation:none!important;transform:none!important}.page{border:none;max-width:none;margin:0;padding:0;background:#fff!important}.header{margin-bottom:18pt}.header .name{font-family:var(--font-serif);font-weight:600;font-size:calc(17pt * var(--print-font-scale));letter-spacing:0;color:#000;text-transform:none;font-variation-settings:normal;line-height:1.05}.header .tagline{font-family:var(--font-serif);font-size:calc(8.4pt * var(--print-font-scale));color:#333;margin-top:3.5pt}.header .summary{font-family:var(--font-serif);font-style:italic;font-size:calc(8.8pt * var(--print-font-scale));line-height:calc(1.32 * var(--print-leading-scale));color:#222;max-width:none;margin-top:6pt}.contact{font-family:var(--font-serif);font-size:calc(8.2pt * var(--print-font-scale));color:#333;gap:2pt 10pt;margin-top:6.5pt}.contact a{color:#000;border-bottom:none}.marker{break-after:avoid;page-break-after:avoid;font-family:var(--font-serif);font-size:calc(9pt * var(--print-font-scale));text-transform:uppercase;letter-spacing:.06em;color:#000;border-bottom:.4pt solid #000;margin-top:10.5pt;margin-bottom:3pt;padding-bottom:1.6pt;font-weight:700}.marker .slash,.marker .rule{display:none!important}.entry{table-layout:fixed;break-inside:avoid;page-break-inside:avoid;border-top:.2pt dotted #777;width:100%;padding:2.5pt 0 2pt;display:table}.entry:first-of-type{border-top:none;padding-top:1pt}.entry .when,.entry:first-of-type .when{vertical-align:top;width:11ch;font-family:var(--font-serif);font-size:calc(8pt * var(--print-font-scale));color:#333;text-align:left;padding-top:.16em;padding-right:8pt;display:table-cell}.entry .body,.entry:first-of-type .body,.entry:last-of-type .body{vertical-align:top;border-left:none;padding:0;display:table-cell}.entry .body:before,.entry:first-of-type .body:before,.awards-grid .aw-body:before{content:none}.awards-grid .aw-body{border-left:none;padding:0}.entry .body h3{font-family:var(--font-serif);font-size:calc(10pt * var(--print-font-scale));color:#000;font-weight:700}.project-title-link{color:#000;border-bottom:none;text-decoration:none}.entry .body .sub{font-family:var(--font-serif);font-size:calc(8pt * var(--print-font-scale));color:#333}.entry .body .sub+.sub{margin-top:0}.entry .body .sub .sub-sep{color:#999;margin:0 .45em}.entry .body ul{margin-top:1.5pt}.entry .body li{font-family:var(--font-serif);font-size:calc(9.3pt * var(--print-font-scale));line-height:calc(1.34 * var(--print-leading-scale));color:#000;margin-top:1.3pt;padding-left:1.5ch}.entry .body li:before{content:"–";color:#000;font-weight:700;top:0}.project-stack{font-family:var(--font-serif);font-size:calc(7.8pt * var(--print-font-scale));color:#333;margin-top:1pt}.project-index{color:#000;font-size:calc(7.6pt * var(--print-font-scale))}.print-one-page{padding-top:9pt}.print-one-page .header{margin-bottom:11pt}.print-one-page .header .name{font-size:calc(18pt * var(--print-font-scale))}.print-one-page .header .summary{font-size:calc(9.1pt * var(--print-font-scale));line-height:calc(1.3 * var(--print-leading-scale));margin-top:5pt}.print-one-page .contact{font-size:calc(8.6pt * var(--print-font-scale));margin-top:5pt}.print-one-page .marker{margin-top:7.5pt;margin-bottom:2.5pt;padding-bottom:1.8pt}.print-one-page .entry{padding-top:2pt;padding-bottom:1.5pt}.print-one-page .entry .body h3{font-size:calc(10.6pt * var(--print-font-scale))}.print-one-page .entry .body .sub{font-size:calc(8.5pt * var(--print-font-scale))}.print-one-page .entry .body li{font-size:calc(9.2pt * var(--print-font-scale));line-height:calc(1.3 * var(--print-leading-scale));margin-top:.9pt}.print-one-page .entry .body ul{margin-top:1.3pt}.print-one-page .project-stack{font-size:calc(6.9pt * var(--print-font-scale))}.print-one-page .awards-grid,.print-one-page .skills-grid{border-spacing:0 1.7pt}.print-one-page .awards-grid .award-name,.print-one-page .skills-grid .sk-list{font-size:calc(8.9pt * var(--print-font-scale))}.awards-grid,.skills-grid{table-layout:fixed;border-collapse:separate;border-spacing:0 2.2pt;width:100%;margin-top:1.5pt;display:table}.awards-grid .aw-row,.skills-grid .sk-row{break-inside:avoid;page-break-inside:avoid;display:table-row}.awards-grid .aw-year,.skills-grid .sk-label{vertical-align:top;width:11ch;font-family:var(--font-serif);font-size:calc(8pt * var(--print-font-scale));color:#333;text-align:left;text-transform:none;letter-spacing:0;padding-top:.2em;padding-right:8pt;display:table-cell}.skills-grid .sk-label{white-space:nowrap;width:22ch}.awards-grid .award-name{font-family:var(--font-serif);font-size:calc(9.2pt * var(--print-font-scale));color:#000;font-weight:400}.awards-grid .aw-body,.skills-grid .sk-list{vertical-align:top;display:table-cell}.awards-grid .award-detail{font-family:var(--font-serif);font-size:calc(8.8pt * var(--print-font-scale));color:#333;font-style:italic}.awards-grid .award-detail-group{margin-left:.35em}.awards-grid .award-separator{color:#333}.skills-grid .sk-list{font-family:var(--font-serif);font-size:calc(9pt * var(--print-font-scale));color:#000;line-height:calc(1.32 * var(--print-leading-scale))}.entry .entry-title-row .when-right,.aw-title-row .aw-year-right{display:none}.dates-right .entry{display:block}.dates-right .entry>.when-left{display:none}.dates-right .entry .body,.dates-right .entry:first-of-type .body,.dates-right .entry:last-of-type .body{display:block}.dates-right .entry-title-row{justify-content:space-between;align-items:baseline;gap:8pt;display:flex}.dates-right .entry-title-row .when-right{text-align:right;white-space:nowrap;width:auto;padding:0;display:block}.dates-right .awards-grid,.dates-right .awards-grid .aw-row{display:block}.dates-right .awards-grid .aw-year-left{display:none}.dates-right .awards-grid .aw-body{display:block}.dates-right .aw-title-row{justify-content:space-between;align-items:baseline;gap:8pt;display:flex}.dates-right .aw-title-row .aw-year-right{text-align:right;white-space:nowrap;width:auto;padding:0;display:block}.lead-entry{break-inside:avoid;margin-top:2pt}.lead-entry .row strong{font-family:var(--font-serif);font-size:calc(9.4pt * var(--print-font-scale))}.lead-entry .row .when,.lead-entry .role{font-family:var(--font-serif);font-size:calc(8pt * var(--print-font-scale));color:#333}.lead-entry p{font-family:var(--font-serif);font-size:calc(8.8pt * var(--print-font-scale));line-height:calc(1.32 * var(--print-leading-scale));color:#000;margin-top:2pt}a[href^=http]:after{content:attr(href);font-family:var(--font-serif);font-size:calc(7pt * var(--print-font-scale));color:#555;margin-left:.6em}.contact a:after{content:none}}
