@font-face{font-family:geist;src:url(../media/geist_regular-s.p.1_10gg-4fsrnf.woff2)format("woff2");font-display:swap;font-weight:400;font-style:normal}@font-face{font-family:geist Fallback;src:local(Arial);ascent-override:94.56%;descent-override:27.76%;line-gap-override:0.0%;size-adjust:106.28%}.qGUpZG_className{font-family:geist,geist Fallback;font-style:normal;font-weight:400}.qGUpZG_variable{--font-sans:"geist", "geist Fallback"}
@font-face{font-family:geistMono;src:url(../media/geist_mono_regular-s.p.1ao4aaxc-mivs.woff2)format("woff2");font-display:swap;font-weight:400;font-style:normal}@font-face{font-family:geistMono Fallback;src:local(Arial);ascent-override:76.43%;descent-override:22.43%;line-gap-override:0.0%;size-adjust:131.49%}.FxKlJa_className{font-family:geistMono,geistMono Fallback;font-style:normal;font-weight:400}.FxKlJa_variable{--font-mono:"geistMono", "geistMono Fallback"}
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--paper:#fafaf8;--ink:#25262b;--muted:#676b77;--line:#d9dce4;--accent:#5f50d3;--wash:#efedf9}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--paper:#151618;--ink:#e5e7ed;--muted:#a1a6b2;--line:#363a46;--accent:#b2a5ff;--wash:#252236}}*{box-sizing:border-box}body{background:var(--paper);color:var(--ink);font:400 16px/1.65 var(--font-sans), sans-serif;-webkit-font-smoothing:antialiased;margin:0}a{color:var(--accent);text-underline-offset:4px;text-decoration-thickness:1px;-webkit-text-decoration-color:var(--line);text-decoration-color:var(--line)}a:hover{text-decoration-color:currentColor}button{font:inherit;cursor:pointer}button:focus-visible,a:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:5px;border-radius:1px}::selection{background:var(--wash);color:var(--ink)}h1,h2,h3,p{margin:0}h1,h2,h3{font-family:var(--font-mono), monospace;font-weight:400}h1{letter-spacing:-.75px;margin-bottom:20px;font-size:24px;line-height:1.3}.greeting-word{vertical-align:top;white-space:pre;height:1.3em;color:inherit;font:inherit;letter-spacing:inherit;line-height:inherit;background:0 0;border:0;border-radius:3px;padding:0;transition:background-color .16s;display:inline-block;position:relative}.greeting-word:hover{background:color-mix(in srgb, var(--accent) 7%, transparent)}.greeting-cursor{background:currentColor;width:1px;height:1em;position:absolute;top:.15em;left:calc(100% + 1px)}.greeting-cursor[data-typing=false]{animation:.9s step-end infinite blink-cursor}@keyframes blink-cursor{50%{opacity:0}}h2{color:var(--ink);font-size:20px}h3{letter-spacing:-.4px;margin-bottom:10px;font-size:16px;line-height:1.5}p+p{margin-top:14px}section,article[id]{scroll-margin-top:88px}.document{padding:48px 32px 56px}.document-column{max-width:576px;margin-inline:auto}.site-header{z-index:10;margin-inline:-32px;background:color-mix(in srgb, var(--paper) 94%, transparent);font:400 14px/1.5 var(--font-mono), monospace;margin-top:-16px;margin-bottom:16px;padding-block:16px;padding-inline:32px;position:sticky;top:0}.header-content{justify-content:space-between;align-items:center;gap:24px;display:flex}.wordmark{align-items:center;min-height:27px;text-decoration:none;display:inline-flex}.wordmark-label{align-items:baseline;gap:12px;display:inline-flex}.wordmark-dot{background:var(--accent);flex-shrink:0;width:8px;height:8px}.site-nav{opacity:0;pointer-events:none;align-items:center;gap:20px;font-size:12px;transition:opacity .2s,transform .2s;display:flex;transform:translateY(-3px)}.site-nav a{padding-block:3px;text-decoration:none}.site-nav a:is(:hover,:focus-visible){text-decoration:underline}.site-header[data-nav-visible=true] .site-nav{opacity:1;pointer-events:auto;transform:none}.intro{margin-bottom:88px}.intro-line{font-size:18px;line-height:1.6}.linear-link{white-space:nowrap;align-items:baseline;gap:.35em;display:inline-flex}.linear-logo{background:currentColor;align-self:center;width:.85em;height:.85em;display:inline-block;-webkit-mask:url(/linear-logo.svg) 50%/contain no-repeat;mask:url(/linear-logo.svg) 50%/contain no-repeat}.section-heading{margin-bottom:25px}.projects{margin-bottom:88px}.experience-heading{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px 24px;display:flex}.experience-row,.project{margin-bottom:44px}.career-period{white-space:nowrap;font-variant-numeric:tabular-nums;display:inline}.career-history{position:relative}.career-history-toggle{width:fit-content;font:400 12px/1.65 var(--font-mono), monospace;color:var(--accent);text-decoration:underline;-webkit-text-decoration-color:var(--line);text-decoration-color:var(--line);text-underline-offset:4px;background:0 0;border:0;margin-top:16px;padding:0;display:block}.career-history-toggle:hover{text-decoration-color:currentColor}.career-preview-trigger{background:0 0;border:0;width:100%;height:100%;padding:0;position:absolute;inset:0}.earlier-experience[data-expanded=false]{--experience-fade-start:32px;max-height:68px;-webkit-mask-image:linear-gradient(to bottom, #000 var(--experience-fade-start), #00000026 calc(var(--experience-fade-start) + 12px), transparent calc(var(--experience-fade-start) + 28px));mask-image:linear-gradient(to bottom, #000 var(--experience-fade-start), #00000026 calc(var(--experience-fade-start) + 12px), transparent calc(var(--experience-fade-start) + 28px));overflow:hidden}.award-icon{vertical-align:-.1em;width:.95em;height:.95em;color:var(--accent)}.period-end{display:inline}.job-role,.project-meta{font:400 12px/1.6 var(--font-mono), monospace;color:var(--muted);margin-top:-3px;margin-bottom:14px}.project-meta p+p{margin-top:0}.project-date{white-space:nowrap;font-variant-numeric:tabular-nums}.profile-links{align-items:center;gap:6px;display:flex}.profile-links a{width:24px;height:24px;color:var(--muted);border-radius:3px;justify-content:center;align-items:center;transition:color .16s;display:inline-flex}.profile-links a:hover,.profile-links a:focus-visible{color:var(--accent)}.profile-links svg{width:20px;height:20px}.project-copy>p{margin-bottom:14px}.project-copy>p:last-child{margin-bottom:0}.experience-copy[data-has-demo=true]>p:last-child,.project-copy[data-has-demo=true]>p:last-child{margin-bottom:14px}.text-actions{flex-wrap:wrap;align-items:center;gap:24px;display:flex}.text-actions a,.text-actions button{font:400 12px/1.7 var(--font-mono), monospace;color:var(--accent)}.text-actions button,.demo-toolbar button{text-decoration:underline;-webkit-text-decoration-color:var(--line);text-decoration-color:var(--line);text-underline-offset:4px;background:0 0;border:0;padding:0}.text-actions button:hover,.demo-toolbar button:hover{text-decoration-color:currentColor}.document-break{border-block:1px solid var(--line);max-width:1056px;margin:28px auto 38px;padding-top:16px}.document-break[hidden]{display:none}.demo-toolbar{font:400 12px/1.7 var(--font-mono), monospace;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:18px;padding:0 0 14px;display:flex}.demo-toolbar button{font:inherit;color:var(--muted)}.demo-window-actions{flex-wrap:wrap;align-items:center;gap:20px;margin-left:auto;display:flex}.demo-toolbar[data-has-tabs=true]{grid-template-columns:1fr;gap:4px 12px;padding-bottom:0;display:grid}.demo-toolbar[data-has-tabs=true] .demo-window-actions{grid-row:1;justify-self:end;margin-left:0}.demo-switch{grid-row:2;grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch;display:grid}@media (min-width:681px){.demo-switch{grid-template-columns:repeat(2,max-content)}}.demo-toolbar .demo-switch button{border-bottom:2px solid var(--line);text-align:left;border-radius:6px 6px 0 0;align-items:center;min-height:44px;padding:8px 10px;line-height:1.4;text-decoration:none;display:flex}.demo-switch button[aria-selected=true]{color:var(--ink);border-bottom-color:var(--accent);background:var(--wash)}.demo-tab-label{text-wrap:balance}.demo-window-actions button{color:var(--accent)}.demo-name{color:var(--muted)}.demo-name-detail{white-space:nowrap;display:inline-block}.demo-context{border-top:1px solid var(--line);background:var(--paper);padding:20px 0 24px;font-size:14px}.demo-context-transition{position:relative}.demo-context-transition[data-transitioning=true]{overflow:hidden}.demo-context-layer[data-outgoing=true]{opacity:0;pointer-events:none;position:absolute;inset:0 0 auto}.demo-context-full>p+p{margin-top:12px}.demo-context-preview,.demo-context-toggle{display:none}.demo-context .demo-credits{color:var(--muted);font:400 12px/1.7 var(--font-mono), monospace;margin-top:10px}.demo-frame-shell{background:var(--paper);position:relative}.demo-frame-shell[data-standalone=true]{flex:1;min-height:0;display:flex}.demo-frame-shell[data-ready=false]>iframe{visibility:hidden}.demo-loading{color:var(--muted);font:400 13px/1.7 var(--font-mono), monospace;place-items:start center;padding-top:64px;display:grid;position:absolute;inset:0}.demo-loading-label{align-items:baseline;gap:12px;display:inline-flex}@media (prefers-reduced-motion:no-preference){.demo-loading .wordmark-dot{animation:1.4s ease-in-out infinite loading-pulse}@keyframes loading-pulse{0%,to{opacity:.4}50%{opacity:.85}}}.site-demo{border:1px solid var(--line);color-scheme:normal;background:#fff;width:100%;height:720px;display:block}.archive-page{flex-direction:column;height:100dvh;display:flex}.archive-header{border-bottom:1px solid var(--line);color:var(--muted);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 24px;padding:14px 24px;font-size:13px;display:flex}.archive-domain{color:var(--ink);font-family:var(--font-mono), monospace}.archive-header a{font:400 12px/1.7 var(--font-mono), monospace;white-space:nowrap}.archive-links{flex-wrap:wrap;gap:8px 20px;display:flex}.archive-frame-host{flex:1;min-height:0;display:flex}.archive-frame{color-scheme:normal;background:#fff;border:0;flex:1;width:100%;min-height:0;display:block}.site-footer{margin-top:56px}.footer-contact{font:400 12px/1.7 var(--font-mono), monospace;margin-top:14px}.contact-link{vertical-align:top;min-height:1.7em;color:var(--accent);white-space:nowrap;text-decoration:underline;-webkit-text-decoration-color:var(--line);text-decoration-color:var(--line);text-underline-offset:4px;background:0 0;border:0;align-items:center;padding:0;text-decoration-thickness:1px;display:inline-flex}.contact-link:hover{text-decoration-color:currentColor}.contact-word{height:1.7em;display:inline-block;position:relative}.contact-link .greeting-cursor{top:.35em}.contact-link[aria-disabled=true]{cursor:default}.contact-link[data-phase=copying],.contact-link[data-phase=copied]{color:var(--muted);text-decoration:none}.contact-error{color:var(--muted);margin-top:4px;display:block}.visually-hidden{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip-link{background:var(--paper);z-index:20;padding:8px 12px;position:absolute;top:-100px;left:16px}.skip-link:focus{top:8px}.intro:focus,.experience:focus,.projects:focus,.project:focus,.experience-row:focus,.earlier-experience:focus{outline:none}@media (prefers-reduced-motion:no-preference){.demo-context-transition[data-transitioning=true] .demo-context-layer[data-outgoing=false]{animation:.12s ease-out both demo-context-in}.demo-context-transition[data-transitioning=true] .demo-context-layer[data-outgoing=true]{animation:.12s ease-out both demo-context-out}@keyframes demo-context-in{0%{opacity:0}to{opacity:1}}@keyframes demo-context-out{0%{opacity:1}to{opacity:0}}html{scroll-behavior:smooth}.document-break{animation:.24s ease-out open-document}@keyframes open-document{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}}@media (max-width:680px){.document{padding:30px 22px 44px}.site-header{margin-inline:-22px;margin-top:-2px;margin-bottom:18px;padding-block:2px;padding-inline:22px}.header-content{gap:12px}.wordmark,.site-nav a{align-items:center;min-height:44px;display:inline-flex}.document:has(.document-break:not([hidden])) .site-header{position:relative}.site-nav{gap:14px}h1{font-size:22px}.intro-line{font-size:17px}.section-heading{margin-bottom:24px}.job-role,.project-meta{font-size:13px}.job-location{display:none}.experience-heading .profile-links{gap:0;margin-block:-5.5px}.experience-heading .profile-links a{width:32px;height:44px}.project-title-secondary{display:block}.project-title-divider{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.site-demo{border-inline:0;height:650px}.document-break{margin-inline:-22px;padding-top:8px}.demo-toolbar,.demo-context{padding-inline:22px}.demo-toolbar{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:4px 12px;padding-bottom:8px;display:grid}.demo-toolbar a,.demo-window-actions button{align-items:center;min-height:44px;display:inline-flex}.demo-open-separate{display:none}.demo-window-actions{flex-wrap:nowrap;justify-self:end;gap:12px;margin-left:0}.demo-tab-period{display:none}.demo-context{padding-block:14px 12px}.demo-context-preview{display:block}.demo-context-full,.demo-context[data-expanded=true] .demo-context-preview{display:none}.demo-context[data-expanded=true] .demo-context-full{display:block}.demo-context-toggle{min-height:44px;color:var(--accent);font:400 12px/1.7 var(--font-mono), monospace;text-decoration:underline;-webkit-text-decoration-color:var(--line);text-decoration-color:var(--line);text-underline-offset:4px;background:0 0;border:0;align-items:center;margin-top:4px;padding:0;display:inline-flex}.demo-context-toggle:hover{text-decoration-color:currentColor}.site-footer{margin-top:38px}.footer-contact{margin-top:4px}.site-footer .text-actions a,.footer-contact .contact-link{min-height:32px}}@media (pointer:coarse){.text-actions a,.text-actions button,.demo-toolbar a,.demo-toolbar button,.contact-link,.career-history-toggle,.wordmark,.site-nav a{align-items:center;min-height:44px;display:inline-flex}.profile-links a{width:44px;height:44px}}@media print{:root{--paper:#fff;--ink:#222;--muted:#555;--accent:#333}.text-actions,.career-history-toggle,.career-preview-trigger,.profile-links,.footer-contact,.site-header,.document-break{display:none}.document{padding:0}.earlier-experience[data-expanded=false]{max-height:none;overflow:visible;-webkit-mask-image:none;mask-image:none}}@media (prefers-reduced-motion:reduce){.site-nav{transition:none;transform:none}.greeting-cursor{display:none}}
