:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--ink:#0e1826;--surface:#142235;--surface-2:#18293e;--bar:#101d2e;--line:#26374f;--line-soft:#1d2c41;--line-strong:#3a5075;--text:#a9b8ce;--text-dim:#74869f;--text-strong:#eef3fa;--signal:#4c8dff;--signal-soft:#4c8dff24;--on-signal:#0e1826;--trace:#5fd0c6;--trace-soft:#5fd0c621;--shadow:0 1px 2px #0000004d, 0 14px 34px -18px #0009;--display:"Space Grotesk", "Segoe UI", system-ui, sans-serif;--body:"Inter", "Segoe UI", system-ui, sans-serif;--mono:"JetBrains Mono", ui-monospace, "SF Mono", Consolas, monospace;--fs-display:clamp(2.375rem, 1.55rem + 3.5vw, 4rem);--fs-h2:clamp(1.5rem, 1.34rem + .72vw, 1.75rem);--fs-h3:1.125rem;--fs-lead:1.1875rem;--fs-body:1.0625rem;--fs-meta:.8125rem;--fs-mono:.75rem;--col:46rem;--gap-section:clamp(4.5rem, 3rem + 6vw, 7rem)}:root[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ink:#f2f5f9;--surface:#fff;--surface-2:#f7f9fc;--bar:#eaf0f7;--line:#c7d2e0;--line-soft:#dce4ee;--line-strong:#a6b6c9;--text:#44566c;--text-dim:#5a6c84;--text-strong:#0f2038;--signal:#1f5fd6;--signal-soft:#1f5fd61a;--on-signal:#fff;--trace:#06736a;--trace-soft:#06736a1a;--shadow:0 1px 2px #0f20380f, 0 8px 24px -12px #0f20382e}*,:before,:after{box-sizing:border-box}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{background:var(--ink);color:var(--text);font-family:var(--body);font-size:var(--fs-body);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0;line-height:1.65;transition:background-color .22s,color .22s}h1,h2,h3{font-family:var(--display);color:var(--text-strong);margin:0;font-weight:500}h1{font-size:var(--fs-display);letter-spacing:-.022em;line-height:1.05}h2{font-size:var(--fs-h2);letter-spacing:-.012em;line-height:1.2}h3{font-size:var(--fs-h3);line-height:1.35}p,ul,ol,dl,dd{margin:0}ul,ol{padding:0;list-style:none}a{color:inherit}:focus-visible{outline:2px solid var(--signal);outline-offset:3px;border-radius:2px}::selection{background:var(--signal-soft);color:var(--text-strong)}.mono{font-family:var(--mono);font-size:var(--fs-mono);letter-spacing:.02em}.link{color:var(--text-strong);background-image:linear-gradient(var(--line), var(--line));background-position:0 100%;background-repeat:no-repeat;background-size:100% 1px;padding-bottom:2px;text-decoration:none;transition:color .16s,background-size .16s,background-image .16s}.link:hover{color:var(--signal);background-image:linear-gradient(var(--signal), var(--signal));background-size:100% 2px}.skip-link{z-index:20;background:var(--surface);border:1px solid var(--signal);color:var(--text-strong);font-size:var(--fs-meta);border-radius:4px;padding:.6rem 1rem;text-decoration:none;transition:top .16s;position:absolute;top:-4rem;left:1rem}.skip-link:focus{top:1rem}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.deflist{border-top:1px solid var(--line-soft)}.deflist-row{border-bottom:1px solid var(--line-soft);grid-template-columns:10.5rem minmax(0,1fr);gap:.25rem 1.5rem;padding:1.05rem 0;display:grid}.deflist dt{color:var(--text-dim);font-size:.9375rem;line-height:1.6}.deflist dd{color:var(--text);font-size:.9375rem;line-height:1.7}@media (width<=620px){.deflist-row{grid-template-columns:minmax(0,1fr);gap:.3rem}}.contact-lead{max-width:34rem;font-size:var(--fs-body);line-height:1.72}.form{gap:1.15rem;max-width:34rem;margin-top:2.25rem;display:grid}.form-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.15rem;display:grid}.form-field{gap:.4rem;display:grid}.form-label{font-size:var(--fs-meta);color:var(--text-dim)}.form-input{width:100%;font-family:var(--body);color:var(--text-strong);background:var(--surface);border:1px solid var(--line);border-radius:5px;padding:.65rem .8rem;font-size:.9375rem;line-height:1.5;transition:border-color .16s,background-color .16s}.form-input:hover{border-color:var(--line-strong)}.form-input:focus{border-color:var(--signal)}.form-input::placeholder{color:var(--text-dim)}.form-textarea{resize:vertical;min-height:8rem}.form-honeypot{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute;left:-9999px}.form-actions{flex-wrap:wrap;align-items:center;gap:.65rem 1.25rem;margin-top:.35rem;display:flex}.form-submit{font-family:var(--body);color:var(--on-signal);background:var(--signal);border:1px solid var(--signal);cursor:pointer;border-radius:5px;padding:.68rem 1.35rem;font-size:.9375rem;font-weight:500;transition:filter .16s,opacity .16s}.form-submit:hover:not(:disabled){filter:brightness(1.08)}.form-submit:disabled{opacity:.55;cursor:not-allowed}.form-status{font-size:var(--fs-meta);color:var(--text-dim);line-height:1.5}.form-status:empty{display:none}.form-done{border-left:2px solid var(--trace);max-width:34rem;margin-top:2.25rem;padding-left:1.25rem}.form-done-title{font-family:var(--display);font-size:var(--fs-h3);color:var(--text-strong);font-weight:500}.form-done-body{margin-top:.5rem;font-size:.9375rem;line-height:1.7}.form-reset{font-family:var(--body);font-size:var(--fs-meta);color:var(--text-dim);border:0;border-bottom:1px solid var(--line-strong);cursor:pointer;background:0 0;margin-top:1rem;padding:0;transition:color .16s,border-color .16s}.form-reset:hover{color:var(--signal);border-color:var(--signal)}.contact-list{margin-top:3rem}.contact-list dd{font-size:var(--fs-meta)}@media (width<=620px){.form-grid{grid-template-columns:minmax(0,1fr)}}.cursor-dot,.cursor-ring{z-index:9999;pointer-events:none;will-change:transform;width:0;height:0;position:fixed;top:0;left:0}.cursor-dot-shape,.cursor-ring-shape{opacity:0;border-radius:50%;transition:opacity .22s,transform .28s cubic-bezier(.22,.7,.28,1),background-color .22s,border-color .22s;display:block}.cursor-dot-shape{background:var(--signal);width:7px;height:7px;box-shadow:0 0 14px var(--signal-soft);margin:-3.5px 0 0 -3.5px}.cursor-ring-shape{border:1px solid var(--signal);width:30px;height:30px;margin:-15px 0 0 -15px}:root.cursor-on .cursor-dot-shape{opacity:1}:root.cursor-on .cursor-ring-shape{opacity:.45}:root.cursor-on.cursor-interactive .cursor-ring-shape{opacity:.9;border-color:var(--trace);transform:scale(1.5)}:root.cursor-on.cursor-interactive .cursor-dot-shape{background:var(--trace);transform:scale(.5)}:root.cursor-on.cursor-down .cursor-ring-shape{transform:scale(.82)}:root.cursor-on.cursor-interactive.cursor-down .cursor-ring-shape{transform:scale(1.25)}:root.cursor-on.cursor-text .cursor-dot-shape,:root.cursor-on.cursor-text .cursor-ring-shape{opacity:0}:root.has-cursor,:root.has-cursor *{cursor:none!important}:root.has-cursor input,:root.has-cursor textarea,:root.has-cursor select{cursor:auto!important}.timeline{border-left:1px solid var(--line);padding-left:1.75rem}.timeline-item{position:relative}.timeline-item+.timeline-item{margin-top:2.75rem}.timeline-item:before{content:"";border:1px solid var(--line-strong);background:var(--ink);border-radius:2px;width:9px;height:9px;position:absolute;top:.5em;left:-2.0625rem}.timeline-item[data-current]:before{border-color:var(--trace);background:var(--trace)}.timeline-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.15rem 1.5rem;display:flex}.timeline-title{font-weight:500}.timeline-period{font-size:var(--fs-meta);color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap}.timeline-org{color:var(--text);margin-top:.3rem;font-size:.9375rem}.timeline-place{color:var(--text-dim)}.timeline-points{gap:.85rem;margin-top:1.15rem;display:grid}.timeline-points li{font-size:var(--fs-body);padding-left:1.15rem;line-height:1.7;position:relative}.timeline-points li:before{content:"";background:var(--line-strong);width:7px;height:1px;position:absolute;top:.72em;left:0}.timeline-note{color:var(--text);margin-top:1rem;font-size:.9375rem;line-height:1.65}.timeline-note-term{color:var(--text-dim)}.timeline-note-term:after{content:"";width:.6rem;display:inline-block}.certs{margin-top:3.5rem}.certs-title{color:var(--text-strong);font-weight:500}.certs-list{border-top:1px solid var(--line-soft);margin-top:1rem}.certs-list li{border-bottom:1px solid var(--line-soft);grid-template-columns:minmax(0,1fr) minmax(0,auto) 5.5rem;align-items:baseline;gap:.15rem 1.5rem;padding:.85rem 0;font-size:.9375rem;display:grid}.cert-name{color:var(--text-strong)}.cert-issuer,.cert-date{color:var(--text-dim);font-size:var(--fs-meta)}.cert-date{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}@media (width<=560px){.certs-list li{grid-template-columns:minmax(0,1fr) 5.5rem}.cert-name{grid-column:1/-1}.cert-date{text-align:right}}.figure{margin:0}.dg{width:100%;max-width:36.5rem;height:auto;display:block;overflow:visible}@media (width<=720px){.dg{max-width:24rem}}.dg text{font-family:var(--mono);fill:var(--text);font-weight:400;transition:fill .2s}.dg-box{fill:var(--surface);stroke:var(--line);stroke-width:1px;transition:stroke .2s,fill .2s}.dg-node--root .dg-box{stroke:var(--signal)}.dg-node--root text{fill:var(--text-strong);font-weight:500}.dg-tick{fill:var(--trace)}.dg-edge{fill:none;stroke:var(--line-strong);stroke-width:1.25px;stroke-linecap:round;transition:stroke .2s}.dg-boundary-line{fill:none;stroke:var(--line);stroke-width:1px;stroke-dasharray:3 5}.dg-boundary-label{fill:var(--text-dim);letter-spacing:.06em;font-size:10.5px}.dg-deny{pointer-events:none}.dg-deny-line{fill:none;stroke:var(--line-strong);stroke-width:1px;stroke-dasharray:2 3.5}.dg-deny-mark circle{fill:var(--ink)}.dg-deny-mark path{fill:none;stroke:var(--text-dim);stroke-width:1.5px;stroke-linecap:round}.dg-hit{fill:#0000;pointer-events:all}.dg-col{transition:opacity .22s}.dg:has(.dg-col:hover) .dg-col:not(:hover){opacity:.36}.dg-col:hover .dg-edge{stroke:var(--signal)}.dg-col:hover .dg-edge--data{stroke:var(--trace)}.dg-col:hover .dg-node--domain .dg-box{stroke:var(--signal);fill:var(--surface-2)}.dg-col:hover .dg-node--store .dg-box{stroke:var(--trace);fill:var(--surface-2)}.dg-col:hover text{fill:var(--text-strong)}.figure-caption{max-width:36.5rem;color:var(--text-dim);flex-wrap:wrap;align-items:center;gap:.5rem 1.35rem;margin-top:1.15rem;line-height:1.5;display:flex}.figure-legend{align-items:center;gap:.45rem;display:inline-flex}.legend-swatch{fill:none;width:22px;height:8px;stroke:var(--line-strong);stroke-width:1.25px;stroke-linecap:round;flex:none}.legend-swatch--deny{stroke:var(--text-dim)}.figure-label{flex-basis:100%}.boot .dg-node{animation:.48s cubic-bezier(.22,.7,.28,1) both dg-node-in;animation-delay:var(--d)}.boot .dg-edge{stroke-dasharray:1;animation:.44s cubic-bezier(.4,0,.2,1) both dg-edge-draw;animation-delay:var(--d)}.boot .dg-boundary,.boot .dg-deny,.boot .figure-caption{animation:.42s ease-out both dg-fade-in;animation-delay:var(--d)}@keyframes dg-node-in{0%{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}@keyframes dg-edge-draw{0%{stroke-dashoffset:1px}to{stroke-dashoffset:0}}@keyframes dg-fade-in{0%{opacity:0}to{opacity:1}}.dg-packet{display:none}@supports (offset-path:path('M0 0 V1')){.dg-packet{fill:var(--trace);opacity:0;offset-distance:0%;offset-rotate:0deg;pointer-events:none;display:block}.dg-col:hover .dg-packet{animation:1.25s cubic-bezier(.45,0,.55,1) infinite dg-packet}}@keyframes dg-packet{0%{offset-distance:0%;opacity:0}15%{opacity:1}85%{opacity:1}to{offset-distance:100%;opacity:0}}@media (prefers-reduced-motion:reduce){.dg-col:hover .dg-packet{animation:none}}.hero{padding-top:clamp(3.5rem,2rem + 6vw,6.5rem);scroll-margin-top:6rem}.hero-name-mask{font-size:var(--fs-display);margin:-.06em -.06em -.1em;padding:.06em .06em .1em;overflow:hidden}.hero-name{font-weight:600}.hero-standfirst{max-width:34rem;margin-top:1.4rem}.hero-role{font-family:var(--display);font-size:var(--fs-lead);letter-spacing:-.008em;color:var(--text-strong);font-weight:500;line-height:1.3}.hero-study{font-size:var(--fs-meta);color:var(--text-dim);margin-top:.4rem;line-height:1.55}.hero-intro{max-width:38rem;font-size:var(--fs-body);margin-top:2rem;line-height:1.72}.hero-links{font-size:var(--fs-meta);flex-wrap:wrap;gap:.6rem 2rem;margin-top:2rem;display:flex}.hero-figure{margin-top:clamp(3.5rem,2.4rem + 4.5vw,5.5rem)}.boot .hero-name{animation:.78s cubic-bezier(.16,.84,.3,1) both hero-rise;animation-delay:var(--d)}.boot .hero-standfirst,.boot .hero-intro,.boot .hero-links{animation:.62s cubic-bezier(.22,.7,.28,1) both hero-settle;animation-delay:var(--d)}@keyframes hero-rise{0%{opacity:0;transform:translateY(118%)}to{opacity:1;transform:none}}@keyframes hero-settle{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}.hero-status{font-size:var(--fs-meta);color:var(--text-dim);border:1px solid var(--line);background:var(--surface);border-radius:999px;align-items:center;gap:.55rem;margin-bottom:1.5rem;padding:.3rem .8rem .3rem .65rem;display:inline-flex}.hero-status-dot{background:var(--trace);width:7px;height:7px;box-shadow:0 0 0 0 var(--trace-soft);border-radius:50%;flex:none;animation:2.8s ease-out infinite status-pulse}@keyframes status-pulse{0%{box-shadow:0 0 0 0 var(--trace-soft)}60%,to{box-shadow:0 0 0 6px #0000}}.boot .hero-status{animation:.62s cubic-bezier(.22,.7,.28,1) both hero-settle;animation-delay:var(--d)}.project{border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow);border-radius:8px;position:relative;overflow:hidden}.project:after{content:"";pointer-events:none;opacity:0;background:radial-gradient(260px circle at var(--mx,50%) var(--my,-200px), var(--signal-soft), transparent 68%);transition:opacity .32s;position:absolute;inset:0}.project:hover:after{opacity:1}@media (hover:none){.project:after{display:none}}.project+.project{margin-top:2.5rem}.project-bar{background:var(--bar);border-bottom:1px solid var(--line);padding:1rem 1.5rem 1.05rem}.project-bar-top{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.35rem 1.5rem;display:flex}.project-repo{color:var(--signal)}.project-source{font-size:var(--fs-meta);color:var(--text-dim);border-bottom:1px solid var(--line-strong);padding-bottom:1px;text-decoration:none;transition:color .16s,border-color .16s}.project-source:hover{color:var(--signal);border-color:var(--signal)}.project-stack{color:var(--text-dim);flex-wrap:wrap;gap:.3rem 1.1rem;margin-top:.7rem;display:flex}.project-body{padding:1.85rem 1.5rem 0}.project-title{font-weight:500}.project-summary{max-width:34rem;font-size:var(--fs-body);color:var(--text-strong);margin-top:.5rem;line-height:1.6}.project-para{max-width:36rem;margin-top:1.1rem;line-height:1.72}.project-metrics{border-top:1px solid var(--line);margin-top:2.25rem;grid-template-columns:repeat(4,minmax(0,1fr));margin-inline:-1.5rem;padding-inline:1.5rem;display:grid}.project-metrics li{border-left:1px solid var(--line-soft);padding:1.35rem 1.15rem}.project-metrics li:first-child{border-left:0;padding-left:0}.metric-value{font-family:var(--mono);color:var(--trace);font-variant-numeric:tabular-nums;font-size:1.3125rem;font-weight:500;line-height:1.2;display:block}.metric-label{font-size:var(--fs-meta);color:var(--text-dim);margin-top:.4rem;line-height:1.4;display:block}@media (width<=700px){.project-bar,.project-body{padding-inline:1.15rem}.project-metrics{grid-template-columns:repeat(2,minmax(0,1fr));margin-inline:-1.15rem;padding-inline:1.15rem}.project-metrics li:nth-child(odd){border-left:0;padding-left:0}.project-metrics li:nth-child(n+3){border-top:1px solid var(--line-soft)}}.work-list{border-top:1px solid var(--line-soft);margin-top:3.25rem}.work-row{border-bottom:1px solid var(--line-soft);color:inherit;padding:1.65rem 0 1.65rem 1.35rem;text-decoration:none;transition:padding-left .32s cubic-bezier(.16,.84,.3,1);display:block;position:relative}.work-row-accent{background:linear-gradient(var(--signal), var(--trace));width:2px;height:0;transition:height .38s cubic-bezier(.16,.84,.3,1);position:absolute;top:1.65rem;left:0}.work-row:hover,.work-row:focus-visible{padding-left:1.85rem}.work-row:hover .work-row-accent,.work-row:focus-visible .work-row-accent{height:calc(100% - 3.3rem)}.work-row-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.25rem 1.5rem;display:flex}.work-row-title{font-family:var(--display);font-size:var(--fs-h3);color:var(--text-strong);font-weight:500;line-height:1.35;transition:color .2s}.work-row:hover .work-row-title{color:var(--signal)}.work-row-source{font-size:var(--fs-meta);color:var(--text-dim);opacity:0;transition:opacity .26s,transform .26s;transform:translateY(3px)}.work-row:hover .work-row-source,.work-row:focus-visible .work-row-source{opacity:1;transform:none}.work-row-stack{color:var(--text-dim);flex-wrap:wrap;gap:.25rem 1.1rem;margin-top:.5rem;display:flex}.work-row-body{max-width:36rem;color:var(--text);margin-top:.85rem;font-size:.9375rem;line-height:1.7;display:block}@media (width<=700px){.work-row-source{opacity:1;transform:none}}.layout{padding-inline:clamp(1.25rem,4vw,2.5rem);max-width:68rem;margin:0 auto;padding-top:3.5rem}.column{max-width:var(--col);padding-bottom:5rem}@media (width>=1080px){.layout{grid-template-columns:9.5rem minmax(0,1fr);gap:4.5rem;padding-top:0;display:grid}}.topbar{z-index:10;background:var(--ink);background:color-mix(in srgb, var(--ink) 84%, transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--line-soft);position:fixed;inset:0 0 auto}.topbar-inner{justify-content:space-between;align-items:center;gap:1rem;max-width:68rem;margin:0 auto;padding:.7rem clamp(1.25rem,4vw,2.5rem);display:flex}.topbar-name{font-family:var(--display);letter-spacing:-.01em;color:var(--text-strong);font-size:.9375rem;font-weight:500;text-decoration:none}@media (width>=1080px){.topbar{-webkit-backdrop-filter:none;backdrop-filter:none;pointer-events:none;background:0 0;border-bottom:0}.topbar-inner{justify-content:flex-end;padding-block:1.75rem}.topbar-inner>*{pointer-events:auto}.topbar-name{display:none}}.theme-toggle{font-family:var(--body);font-size:var(--fs-meta);color:var(--text-dim);background:var(--surface);border:1px solid var(--line);cursor:pointer;border-radius:999px;align-items:center;gap:.5rem;padding:.34rem .7rem .34rem .55rem;transition:color .16s,border-color .16s,background-color .16s;display:inline-flex}.theme-toggle:hover{color:var(--text-strong);border-color:var(--line-strong);background:var(--surface-2)}.theme-toggle-icon{stroke:currentColor;fill:currentColor;flex:none;width:15px;height:15px}.rail{display:none}@media (width>=1080px){.rail{align-self:start;height:100vh;display:block;position:sticky;top:0}.rail-list{flex-direction:column;justify-content:center;height:100%;display:flex;position:relative}.rail-list:before,.rail-list:after{content:"";width:1px;position:absolute;top:.9rem;left:4px}.rail-list:before{background:var(--line-soft);bottom:.9rem}.rail-list:after{height:calc((100% - 1.8rem) * var(--progress,0));background:linear-gradient(var(--trace), var(--signal))}}.rail-link{font-size:var(--fs-meta);color:var(--text-dim);padding:.42rem 0 .42rem 1.5rem;line-height:1.4;text-decoration:none;transition:color .18s;display:block;position:relative}.rail-link:hover{color:var(--text)}.rail-link[aria-current]{color:var(--text-strong)}.rail-node{box-sizing:border-box;border:1px solid var(--line-strong);background:var(--ink);border-radius:2px;width:9px;height:9px;margin-top:-4.5px;transition:background-color .18s,border-color .18s;position:absolute;top:50%;left:0}.rail-link:hover .rail-node{border-color:var(--signal)}.rail-link[aria-current] .rail-node{border-color:var(--signal);background:var(--signal)}.section{margin-top:var(--gap-section);border-top:1px solid var(--line-soft);padding-top:2.25rem;scroll-margin-top:5rem;position:relative}.section:before{content:"";background:var(--line-strong);width:5px;height:5px;position:absolute;top:-3px;left:0}.reveal{opacity:0;transition:opacity .72s ease-out var(--rd,0s), transform .72s cubic-bezier(.16, .84, .3, 1) var(--rd,0s);transform:translateY(16px)}.reveal.is-in{opacity:1;transform:none}.reveal.title-mask{opacity:1;font-size:var(--fs-h2);margin-bottom:calc(2rem - .14em);padding-bottom:.14em;overflow:hidden;transform:none}.title-mask .section-title{opacity:0;transition:opacity .52s ease-out,transform .82s cubic-bezier(.16,.84,.3,1);transform:translateY(115%)}.title-mask.is-in .section-title{opacity:1;transform:none}.footer{margin-top:var(--gap-section);border-top:1px solid var(--line-soft);font-size:var(--fs-meta);color:var(--text-dim);padding-top:1.75rem}.boot .topbar,.boot .rail{animation:.62s ease-out .26s both shell-fade}@keyframes shell-fade{0%{opacity:0}to{opacity:1}}
