:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--paper:#f8f5ef;--ink:#1f1d1a;--muted:#6b665d;--line:#e2dccf;--accent:#0f6b52;--marker:#ffd36b;--serif:"Fraunces", Georgia, serif;--sans:"Figtree", system-ui, -apple-system, "Segoe UI", sans-serif;font-family:var(--sans);color:var(--ink);background:var(--paper);font-size:1.0625rem;line-height:1.65}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}:root:not([data-theme=light]){--paper:#121614;--ink:#ece8df;--muted:#a39d91;--line:#2a302c;--accent:#6fd6ae;--marker:#8a6a12}}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--paper:#121614;--ink:#ece8df;--muted:#a39d91;--line:#2a302c;--accent:#6fd6ae;--marker:#8a6a12}:root[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.theme-toggle{z-index:10;border:1.5px solid var(--line);background:var(--paper);width:2.5rem;height:2.5rem;color:var(--accent);cursor:pointer;border-radius:50%;place-items:center;padding:0;transition:border-color .2s,transform .2s;display:grid;position:fixed;top:1rem;right:1rem}.theme-toggle:hover,.theme-toggle:focus-visible{border-color:var(--accent)}.theme-toggle:active{transform:scale(.92)}.theme-toggle svg{fill:none;stroke:currentColor;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;width:1.25rem;height:1.25rem}.theme-toggle .filled{fill:currentColor;stroke:none}body{background:var(--paper);margin:0}a{color:var(--accent);text-underline-offset:.2em;text-decoration-thickness:1px}a:hover{text-decoration-thickness:2px}.hero{text-align:center;padding:2.5rem 1rem 1rem}.journey{width:100%;max-width:72rem;height:auto;margin:0 auto;display:block;overflow:visible}.journey path,.journey circle{fill:none;stroke:var(--accent);stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round}.journey .hub-ring{stroke:none}.journey .toppings circle{fill:var(--accent);stroke:none;opacity:.6}.journey .airflow path{stroke-width:1.1px;stroke-dasharray:6 5;opacity:.55}.journey .typing path,.journey .steam path{stroke-width:1.3px;opacity:.7}.journey text{text-anchor:middle;fill:var(--muted);font-family:var(--sans)}.journey .name{fill:var(--ink);font-size:7.5px;font-weight:600}.journey .year{font-family:JetBrains Mono,ui-monospace,monospace;font-size:6.5px}.journey .ping{fill:var(--accent);stroke:none}@media (prefers-reduced-motion:no-preference){.journey .ink{stroke-dasharray:1;stroke-dashoffset:1px;animation:ease-in-out both ink}.journey .extra,.journey .portrait,.journey text{opacity:0;animation:appear .6s ease forwards var(--start)}.journey .extra *,.journey .portrait{transform-box:fill-box}.journey .toppings circle{transform-origin:50%;animation:pop 3s ease-in-out infinite var(--start)}.journey .steam path{animation:steam 2.4s ease-out infinite var(--start)}.journey .steam path+path{animation-delay:calc(var(--start) + 1.2s)}.journey .typing path{stroke-dasharray:32;stroke-dashoffset:32px;animation:type 4s steps(8) infinite var(--start)}.journey .typing path:nth-child(2){animation-delay:calc(var(--start) + .6s)}.journey .typing path:nth-child(3){animation-delay:calc(var(--start) + 1.2s)}.journey .tassel{transform-origin:50% 0;animation:swing 2.4s ease-in-out infinite var(--start)}.journey .boat{transform-origin:50% 100%;animation:bob 3s ease-in-out infinite var(--start)}.journey .rotor{transform-origin:50%;animation:spin 5s linear infinite var(--start)}.journey .tick,.journey .ticks path{stroke-dasharray:1;stroke-dashoffset:1px;animation:tick 4s ease-in-out infinite var(--start)}.journey .ticks path+path{animation-delay:calc(var(--start) + .8s)}.journey .airflow path{animation:dash 1.6s linear infinite var(--start)}.journey .ping{transform-origin:50%;animation:ping 2.4s ease-out infinite var(--start)}}@keyframes ink{0%{opacity:0}1%{opacity:1}to{stroke-dashoffset:0;opacity:1}}@keyframes appear{to{opacity:1}}@keyframes pop{0%,70%,to{transform:scale(1)}80%{transform:scale(1.35)}}@keyframes steam{0%{opacity:0;transform:translateY(3px)}40%{opacity:.7}to{opacity:0;transform:translateY(-4px)}}@keyframes type{0%{stroke-dashoffset:32px}50%,to{stroke-dashoffset:0}}@keyframes tick{0%,15%{stroke-dashoffset:1px}40%,85%{stroke-dashoffset:0}to{stroke-dashoffset:-1px}}@keyframes ping{0%{opacity:1;transform:scale(1)}70%,to{opacity:0;transform:scale(2.6)}}.hero-text{padding:0 1rem}h1{font-family:var(--serif);letter-spacing:-.02em;font-variation-settings:"SOFT" 100, "WONK" 1;margin:.5rem 0 0;font-size:clamp(2.4rem,7vw,4rem);font-weight:600;line-height:1.1}.marker{background:linear-gradient(transparent 58%, var(--marker) 58%, var(--marker) 90%, transparent 90%);margin:0 -.1em;padding:0 .1em}.headline{margin:.75rem 0 0;font-size:1.2rem}.headline:after{content:"";vertical-align:-.2em;background:var(--accent);width:.55em;height:1.1em;margin-left:.2em;animation:1.1s step-end infinite blink;display:inline-block}@keyframes blink{50%{opacity:0}}.location{color:var(--muted);margin:.15rem 0 0}main{max-width:42rem;margin:0 auto;padding:1rem 1rem 0}.intro{font-size:1.15rem}h2{font-family:var(--serif);align-items:center;gap:.75rem;margin:3.5rem 0 1.25rem;font-size:1.75rem;font-style:italic;font-weight:600;display:flex}h2:after{content:"";background:var(--accent);flex:0 0 3rem;height:.6rem;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 10'%3E%3Cpath d='M1 5c5.5-5 10-5 15.3 0s10 5 15.4 0 10-5 15.3 0' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 10'%3E%3Cpath d='M1 5c5.5-5 10-5 15.3 0s10 5 15.4 0 10-5 15.3 0' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") 50%/contain no-repeat}.timeline{--glyph:2.5rem;margin:0;padding:0;list-style:none}.timeline>li{padding:0 0 2.25rem calc(var(--glyph) + 1.1rem);min-height:var(--glyph);position:relative}.timeline>li:last-child{padding-bottom:0}.timeline>li:not(:last-child):before{content:"";left:calc(var(--glyph) / 2 - 1px);top:calc(var(--glyph) + .3rem);background:var(--line);transform-origin:top;border-radius:1px;width:2px;position:absolute;bottom:.3rem}.timeline .glyph{width:var(--glyph);height:var(--glyph);border:1.5px solid var(--accent);background:var(--paper);color:var(--accent);border-radius:50%;place-items:center;transition:background .2s,color .2s;display:grid;position:absolute;top:-.35rem;left:0}.timeline>li:hover .glyph{background:var(--accent);color:var(--paper)}.glyph svg{fill:none;stroke:currentColor;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;width:62%;height:62%;overflow:hidden}.timeline p{margin:.4rem 0 0}.timeline .period{letter-spacing:.04em;text-transform:uppercase;color:var(--accent);margin:0;font-size:.85rem;font-weight:600}.timeline h3{margin:.15rem 0 0;font-size:1.15rem;font-weight:600;line-height:1.35}.timeline .at{font-family:var(--serif);color:var(--muted);font-style:italic;font-weight:400}.roles{border-left:2px solid var(--marker);margin:.2rem 0 .15rem;padding:0 0 0 .9rem;list-style:none}.roles li{flex-wrap:wrap;justify-content:space-between;column-gap:1rem;display:flex}.roles li+li{margin-top:.15rem}.role{font-weight:500}.role-period{color:var(--muted);font-size:.85rem}.timeline .place{color:var(--muted);margin:0;font-size:.9rem}@media (prefers-reduced-motion:no-preference){.timeline.ready>li{opacity:0;transition:opacity .6s,transform .6s;transform:translateY(1rem)}.timeline.ready>li.seen{opacity:1;transform:none}.timeline.ready>li:before{transition:transform 1.2s .3s;transform:scaleY(0)}.timeline.ready>li.seen:before{transform:scaleY(1)}.glyph *{transform-box:view-box;animation-play-state:paused!important}li.playing .glyph *{animation-play-state:running!important}.glyph-key .ping{fill:currentColor;transform-origin:8px 12px;animation:2.4s ease-out infinite ping}.glyph-form .draw{stroke-dasharray:10;stroke-dashoffset:10px;animation:3s ease-in-out infinite write-line}.glyph-pizza .steam{animation:2.4s ease-out infinite steam}.glyph-airfoil .stream{stroke-dasharray:3 2.5;animation:1.2s linear infinite dash}.glyph-shield .draw,.glyph-sigma .draw{stroke-dasharray:40;stroke-dashoffset:40px;animation:3.5s ease-in-out infinite write}.glyph-browser .line{stroke-dasharray:12;stroke-dashoffset:12px;animation:3s steps(6,end) infinite write-line}.glyph-browser .line:nth-of-type(3){animation-delay:.9s}.glyph-turbine .rotor{transform-origin:12px 9.5px;animation:4s linear infinite spin}.glyph-boat .hull{transform-origin:12px 17px;animation:3s ease-in-out infinite bob}.glyph-boat .waves{animation:1.6s linear infinite waves}.glyph-cap .tassel{transform-origin:21.5px 9px;animation:2.4s ease-in-out infinite swing}}@keyframes dash{to{stroke-dashoffset:-11px}}@keyframes write{0%{stroke-dashoffset:40px}45%,80%{stroke-dashoffset:0}to{stroke-dashoffset:-40px}}@keyframes write-line{0%{stroke-dashoffset:12px}60%,to{stroke-dashoffset:0}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes bob{0%,to{transform:translateY(0)rotate(-3deg)}50%{transform:translateY(-1px)rotate(3deg)}}@keyframes waves{to{transform:translate(-4px)}}@keyframes swing{0%,to{transform:rotate(-12deg)}50%{transform:rotate(12deg)}}.tags{flex-wrap:wrap;gap:.4rem;margin:.6rem 0 0;padding:0;list-style:none;display:flex}.tags li{border:1px solid var(--line);color:var(--muted);border-radius:999px;padding:.05rem .6rem;font-size:.8rem}.publication{margin:0}.publication span{color:var(--muted);font-size:.95rem}.skills{grid-template-columns:max-content 1fr;gap:.5rem 1.5rem;margin:0;display:grid}.skills dt{font-weight:600}.skills dd{margin:0}@media (width<=30rem){.skills{grid-template-columns:1fr;gap:0}.skills dd{margin-bottom:.75rem}}footer{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;gap:1rem;max-width:42rem;margin:4rem auto 0;padding:1.5rem 1rem 3rem;display:flex}.links{flex-wrap:wrap;gap:1.25rem;margin:0;padding:0;font-weight:500;list-style:none;display:flex}.copyright{color:var(--muted);margin:0;font-size:.9rem}@media print{:root{--paper:#fff;--ink:#000;--muted:#444;--accent:#000;font-size:10.5pt}.journey,.theme-toggle,.tags,h2:after{display:none}h2{margin-top:1.5rem}.timeline>li{break-inside:avoid;padding-bottom:1rem;opacity:1!important;transform:none!important}.headline:after{display:none}}
