:root{color-scheme:light;--bg-dim:#efebd4;--bg0:#fdf6e3;--bg1:#f4f0d9;--bg2:#efebd4;--bg3:#e6e2cc;--bg4:#e0dcc7;--bg5:#bdc3af;--bg-visual:#eaedc8;--bg-green:#f0f1d2;--fg:#5c6a72;--red:#f85552;--orange:#f57d26;--yellow:#dfa000;--green:#8da101;--aqua:#35a77c;--blue:#3a94c5;--purple:#df69ba;--grey0:#a6b0a0;--grey1:#939f91;--grey2:#829181;--border:var(--bg3);--muted:var(--grey2);--sans:-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--mono:"SFMono-Regular", Consolas, "Liberation Mono", monospace;--header-height:76px;--flash-duration:420ms;font-family:var(--sans);font-synthesis:none;text-rendering:optimizeLegibility}:root[data-theme=dark]{color-scheme:dark;--bg-dim:#232a2e;--bg0:#2d353b;--bg1:#343f44;--bg2:#3d484d;--bg3:#475258;--bg4:#4f585e;--bg5:#56635f;--bg-visual:#543a48;--bg-green:#425047;--fg:#d3c6aa;--red:#e67e80;--orange:#e69875;--yellow:#dbbc7f;--green:#a7c080;--aqua:#83c092;--blue:#7fbbb3;--purple:#d699b6;--grey0:#7a8478;--grey1:#859289;--grey2:#9da9a0}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:calc(var(--header-height) + 28px);background:var(--bg0)}body{margin:0;background:var(--bg0);color:var(--fg);font-size:16px;line-height:1.7;-webkit-font-smoothing:antialiased}body,.site-header,.tag,.search-dialog{transition:background-color 180ms ease,color 180ms ease,border-color 180ms ease}img,svg{display:block;max-width:100%}a{color:inherit;text-decoration-color:var(--grey1);text-decoration-thickness:1px;text-underline-offset:.22em}a:hover{color:var(--green);text-decoration-color:var(--green)}button,input{color:inherit;font:inherit}button,summary{-webkit-tap-highlight-color:transparent}button{cursor:pointer}:focus-visible{border-radius:2px;outline:2px solid var(--green);outline-offset:5px}::selection{background:var(--bg-visual);color:var(--fg)}[hidden]{display:none!important}h1,h2,h3,p,figure,ul,ol,pre{margin-top:0}h1,h2,h3{font-weight:560;letter-spacing:-.035em;line-height:1.12}h3{font-size:1.25rem}kbd,.eyebrow,.entry-index,.entry-tech,.entry-status,.blog-date,.publication-year,.tag,.search-hint{font-family:var(--mono)}kbd{display:inline-grid;min-width:1.25rem;min-height:1.25rem;place-items:center;border:1px solid var(--border);border-radius:3px;background:var(--bg1);color:var(--green);font-size:.68rem;font-weight:400;line-height:1}.page-width,.nav-shell,.footer-inner{width:min(calc(100% - 48px),var(--content-width));margin-inline:auto}.muted{color:var(--muted)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip-link{position:fixed;z-index:1000;top:12px;left:12px;padding:8px 14px;background:var(--green);color:var(--bg0);transform:translateY(-180%)}.skip-link:focus{transform:translateY(0)}.site-header{position:fixed;z-index:100;inset:0 0 auto;height:var(--header-height);background:var(--bg0)}.site-header::after{position:absolute;right:0;bottom:0;left:0;height:1px;background:var(--border);content:"";opacity:0;transition:opacity 180ms ease}.is-scrolled .site-header::after,.inner-page .site-header::after{opacity:1}.nav-shell{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;height:100%;gap:32px}.navbar-brand{display:flex;align-items:center;min-width:0;gap:12px;font-size:.92rem;font-weight:560;letter-spacing:-.035em;text-decoration:none}.navbar-name{line-height:1.12;white-space:nowrap}.navbar-avatar{width:36px;height:36px;flex:none;overflow:hidden;border-radius:50%}.navbar-avatar img{display:block;width:100%;height:100%;object-fit:cover;transform:scale(max(1,var(--avatar-zoom,1.2)));transform-origin:var(--avatar-origin,50% 38%)}.home:not(.is-scrolled) .navbar-brand{opacity:0;pointer-events:none;transform:none}.navbar-brand{transition:opacity 180ms ease,transform 220ms ease}.home .navbar-brand{transition:none}.primary-nav{display:flex;align-items:center;gap:28px}.primary-nav a{display:flex;min-height:40px;align-items:center;padding-block:10px;color:var(--muted);font-size:.82rem;letter-spacing:.01em;text-decoration:none}.primary-nav a:hover,.primary-nav a.is-current{color:var(--fg)}.shortcut-letter{color:var(--orange);font-weight:650}.primary-nav a:hover .shortcut-letter,.primary-nav a.is-current .shortcut-letter{color:var(--yellow)}.section-heading h2 .shortcut-letter{transition:color 160ms ease}.nav-utilities{display:flex;justify-content:flex-end;gap:7px}.icon-button{display:none;width:38px;height:38px;padding:9px;place-items:center;border:1px solid transparent;border-radius:4px;background:0 0}.js .icon-button{display:inline-grid}.icon-button:hover,.icon-button[aria-pressed=false]{border-color:var(--border);background:var(--bg1)}.icon-button svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}.search-trigger{position:relative;width:52px;grid-template-columns:1fr auto;gap:2px}.search-trigger svg{width:17px}.search-trigger kbd{border:0;background:0 0;font-size:.62rem}.theme-icon{grid-area:1/1}[data-shortcuts-toggle][aria-pressed=true] .shortcut-icon-disabled,[data-shortcuts-toggle][aria-pressed=false] .shortcut-icon-enabled{display:none}[data-shortcuts-toggle][aria-pressed=false]{color:var(--orange)}[data-theme=light] .theme-icon-sun,[data-theme=dark] .theme-icon-moon{display:none}.identity-flight{position:fixed;z-index:101;inset:0;display:none;overflow:hidden;pointer-events:none}.identity-in-flight .identity-flight{display:block}.identity-flight-portrait-frame,.identity-flight-name{position:absolute;top:0;left:0;max-width:none;transform-origin:0 0;will-change:transform}.identity-flight-portrait-frame{overflow:hidden}.identity-flight-portrait{display:block;width:100%;height:100%;max-width:none;object-fit:cover;transform-origin:var(--avatar-origin,50% 38%);will-change:transform}.identity-flight-name{color:var(--fg);font-family:var(--sans);font-weight:560;letter-spacing:-.035em;white-space:nowrap}.identity-flight-name span{display:inline-block;color:var(--green);font-family:var(--mono);font-size:.25em;font-weight:400;letter-spacing:0;vertical-align:top;transform:translateY(.8em)}.identity-in-flight .hero-portrait,.identity-in-flight .hero h1{opacity:0}.identity-in-flight .hero-portrait::before{opacity:0}.hero{padding-top:calc(var(--header-height) + 76px)}.hero-grid{display:grid;grid-template-columns:var(--portrait-size)minmax(0,1fr);align-items:center;gap:clamp(36px,6vw,80px)}.hero-portrait{position:relative}.hero-portrait::before{position:absolute;z-index:-1;inset:14px -14px -14px 14px;border:1px solid var(--border);content:""}.hero-portrait img{width:100%;height:auto;border-radius:2px;object-fit:cover}.eyebrow{margin-bottom:18px;color:var(--green);font-size:.73rem;font-weight:500;letter-spacing:.035em;text-transform:lowercase}.hero h1{max-width:720px;margin-bottom:18px;font-size:clamp(2.65rem,5vw,4.5rem)}.hero h1 span{display:inline-block;color:var(--green);font-family:var(--mono);font-size:.25em;font-weight:400;letter-spacing:0;vertical-align:top;transform:translateY(.8em)}.role-line{margin-bottom:24px;color:var(--muted);font-family:var(--mono);font-size:clamp(.73rem,1.4vw,.87rem);line-height:1.65}.hero-bio{max-width:68ch;color:var(--fg);font-size:1.02rem}.hero-bio p{margin-bottom:24px}.contact-list{display:flex;flex-wrap:wrap;margin:30px 0 0;padding:0;gap:10px 24px;list-style:none}.contact-list a{display:inline-flex;min-height:40px;align-items:center;gap:8px;font-size:.84rem;font-weight:500;text-decoration:none}.contact-list a span{color:var(--green);font-family:var(--mono)}.contact-list .cv-link{padding-inline:14px;border:1px solid var(--border)}.contact-list .cv-link:hover{border-color:var(--green)}.intro-landscape{margin:76px 0 0}.intro-landscape img{width:100%;height:clamp(260px,38vw,420px);border-radius:2px;object-fit:cover;object-position:50% 42%;filter:saturate(.78)}.intro-landscape figcaption{margin-top:10px;color:var(--muted);font-family:var(--mono);font-size:.7rem;text-align:right}.portfolio-section{margin-top:clamp(100px,12vw,152px);scroll-margin-top:var(--header-height)}.section-heading{display:grid;grid-template-columns:1fr minmax(260px,.65fr);align-items:end;margin-bottom:40px;padding-top:28px;border-top:1px solid var(--border);gap:48px}.section-heading .eyebrow{margin-bottom:9px}.section-heading h2{margin-bottom:0;font-size:clamp(2rem,4vw,3rem);text-transform:lowercase}.section-heading>p{margin-bottom:3px;color:var(--muted);font-size:.9rem}.collection{margin:0;padding:0;border-bottom:1px solid var(--border);list-style:none}.collection-item{border-top:1px solid var(--border)}.js .collection-item[data-extra]:not(.is-revealed){display:none}.entry{display:grid;padding-block:32px;gap:28px;outline-offset:2px}.project-entry{grid-template-columns:36px minmax(0,1fr)150px}.entry-index,.blog-date,.publication-year{margin:4px 0 0;color:var(--muted);font-size:.72rem}.entry h3{margin-bottom:12px}.entry h3.is-targeted{background:var(--bg-green);box-shadow:0 0 0 9px var(--bg-green)}.entry h3 a{text-decoration:none}.entry h3 a span{display:inline-block;margin-left:8px;color:var(--green);font-family:var(--mono);font-size:.75em;font-weight:400;transition:transform 160ms ease}.entry h3 a:hover span{transform:translate(2px,-2px)}.entry-main>p:not([class]){max-width:72ch;margin-bottom:18px;color:var(--muted);font-size:.92rem}.entry-tech{margin-bottom:14px;color:var(--grey2);font-size:.72rem}.entry-aside{text-align:right}.entry-status{margin-bottom:14px;color:var(--muted);font-size:.68rem}.entry-links{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 18px;font-family:var(--mono);font-size:.7rem}.entry-aside .entry-links{justify-content:flex-end}.entry-links a,.text-button,.bibtex summary{color:var(--green);text-underline-offset:4px}.tag-list{display:flex;flex-wrap:wrap;margin:0;padding:0;gap:7px;list-style:none}.tag{min-height:29px;padding:4px 9px;border:1px solid var(--border);border-radius:3px;background:0 0;color:var(--muted);font-size:.66rem;line-height:1.2}button.tag:hover,button.tag[aria-pressed=true]{border-color:var(--green);background:var(--bg-green);color:var(--green)}.collection-actions{display:flex;justify-content:space-between;padding-top:20px}.text-button{min-height:40px;padding:0;border:0;background:0 0;font-family:var(--mono);font-size:.75rem;text-decoration:underline;text-decoration-color:transparent}.text-button:hover{text-decoration-color:var(--green)}.filter-reset{margin-left:auto;color:var(--muted)}.publication-entry{grid-template-columns:58px minmax(0,1fr)}.publication-entry h3{max-width:900px;font-size:1.18rem;line-height:1.35}.publication-authors{margin-bottom:4px;font-size:.85rem}.publication-venue{margin-bottom:14px;color:var(--muted);font-size:.82rem}.entry-main .publication-abstract{max-width:78ch}.publication-entry .tag-list{margin-bottom:16px}.bibtex{position:relative}.bibtex summary{min-height:28px;cursor:pointer}.bibtex pre{position:relative;z-index:2;max-width:min(680px,80vw);max-height:320px;margin:12px 0;padding:20px;overflow:auto;border:1px solid var(--border);background:var(--bg1);font:.72rem/1.6 var(--mono);white-space:pre-wrap}.blog-entry{grid-template-columns:120px minmax(0,1fr)auto}.blog-entry h3{margin-bottom:9px}.blog-entry .tag-list{margin-top:18px}.read-link{align-self:center;font-family:var(--mono);font-size:.7rem;text-decoration:none}.article{max-width:var(--reading-width);padding-top:calc(var(--header-height) + 70px);padding-bottom:100px}.back-link{display:inline-block;margin-bottom:60px;color:var(--muted);font:.76rem var(--mono);text-decoration:none}.article-header{margin-bottom:48px;padding-bottom:36px;border-bottom:1px solid var(--border)}.article-header h1{margin-bottom:24px;font-size:clamp(2.4rem,6vw,4rem)}.article-description{color:var(--muted);font-size:1.12rem}.markdown-link{display:inline-block;margin-top:24px;color:var(--muted);font:.7rem var(--mono);text-decoration:none}.markdown-link span{color:var(--orange)}.article-body{font-size:1.04rem;line-height:1.85}.article-body h2{margin-top:2em;font-size:1.65rem}.article-body img{width:100%;height:auto;margin-block:24px}.search-dialog{width:min(calc(100% - 32px),680px);max-height:min(720px,calc(100dvh - 64px));margin-top:max(32px,10vh);padding:0;overflow:auto;border:1px solid var(--border);border-radius:5px;background:var(--bg0);color:var(--fg);box-shadow:0 20px 70px color-mix(in srgb,var(--bg-dim) 65%,transparent)}.search-dialog::backdrop{background:color-mix(in srgb,var(--bg-dim) 80%,transparent)}.search-dialog-inner{padding:24px}.search-dialog-heading{display:flex;align-items:center;justify-content:space-between;gap:20px}.search-dialog h2{margin:0;font-size:1.05rem;letter-spacing:-.02em}.search-dialog input{width:100%;height:52px;margin-top:20px;padding:0 2px;border:0;border-bottom:1px solid var(--green);border-radius:0;outline:none;background:0 0;font-size:1.08rem}.search-status{margin:24px 0;color:var(--muted);font-size:.85rem}.search-hint{margin:20px 0 0;color:var(--muted);font-size:.65rem}.search-hint kbd{margin-inline:4px}.search-results{display:grid;margin-top:4px;gap:2px}.search-result{display:grid;padding:12px;border-left:2px solid transparent;color:var(--fg);text-decoration:none}.search-result:hover,.search-result:focus-visible{border-left-color:var(--orange);outline:none;background:var(--bg1);color:var(--fg)}.search-result-title{color:var(--fg);font-size:.9rem;font-weight:560}.search-result:hover .search-result-title,.search-result:focus-visible .search-result-title{color:var(--green)}.search-result-excerpt{display:-webkit-box;margin-top:3px;overflow:hidden;color:var(--muted);font-size:.78rem;line-height:1.55;-webkit-box-orient:vertical;-webkit-line-clamp:2}.search-result mark{background:var(--bg-green);color:var(--green)}.key-flash{position:fixed;z-index:90;inset:0;background:linear-gradient(to top,var(--bg-green),transparent 24%);opacity:0;pointer-events:none}.key-flash[data-origin=top]{background:linear-gradient(to bottom,var(--bg-green),transparent 24%)}.key-flash.is-active{animation:edge-flash var(--flash-duration)ease-out}.primary-nav a.is-flashing,.icon-button.is-flashing{background:var(--bg-green);color:var(--green)}.primary-nav a.is-flashing .shortcut-letter{color:var(--orange)}@keyframes edge-flash{0%{opacity:0}28%{opacity:.75}100%{opacity:0}}.site-footer{position:relative;margin-top:140px;overflow:hidden;border-top:1px solid var(--border);background:var(--bg1)}.footer-inner{position:relative;display:flex;min-height:190px;align-items:center;justify-content:space-between;padding-block:52px;gap:40px}.footer-inner p{margin-bottom:4px;font-size:.85rem}.footer-inner .muted{font-size:.76rem}.footer-inner nav{display:flex;flex-wrap:wrap;gap:14px 25px;font:.7rem var(--mono)}.footer-pointer-glow{position:absolute;inset:0;display:block;width:100%;height:100%;image-rendering:pixelated;opacity:0;pointer-events:none;transition:opacity 200ms ease}.footer-pointer-glow.is-active{opacity:.55}.visual-test-page{max-width:var(--content-width)}.visual-test-note{max-width:70ch;color:var(--muted);font-size:.88rem}.visual-test-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:44px;gap:42px 24px}.visual-test-card{margin:0}.visual-test-card canvas{display:block;width:100%;height:auto;border:1px solid var(--border);background:var(--bg1);image-rendering:pixelated}.visual-test-card figcaption{padding-top:17px}.visual-test-card h2{margin-bottom:8px;font:500 .92rem var(--mono);letter-spacing:-.02em}.visual-test-card h2::first-letter{color:var(--orange)}.visual-test-card p{margin-bottom:0;color:var(--muted);font-size:.84rem}.not-found-page{height:100dvh;overflow:hidden;overscroll-behavior:none}.not-found-page .site-footer{display:none}.not-found{display:flex;height:100dvh;min-height:0;padding-top:calc(var(--header-height) + 12px);padding-bottom:0;flex-direction:column}.not-found-header>p:last-child{max-width:64ch;color:var(--muted)}.fall-board{position:relative;flex:1;min-height:170px;margin-block:0 12px;overflow:hidden;border-block:1px solid var(--border)}.digit-slot,.falling-digit{position:absolute;top:12px;display:grid;width:26%;height:clamp(158px,28vw,230px);margin:0;padding:0 0 .08em;place-items:center;font-family:var(--sans);font-size:clamp(6.5rem,20vw,12rem);font-weight:520;letter-spacing:-.09em;line-height:1}.digit-slot{color:var(--grey1);opacity:0;transition:opacity 180ms ease,color 180ms ease}.has-fallen .digit-slot{opacity:.28}.digit-slot.is-magnetic{color:var(--orange);opacity:.48}.digit-slot.is-filled{opacity:.08}.falling-digit{z-index:2;border:0;border-radius:0;background:0 0;color:var(--fg);cursor:grab;touch-action:none;will-change:transform}.falling-digit:disabled{cursor:default;opacity:1}.falling-digit.is-dragging{color:var(--green);cursor:grabbing}.falling-digit.is-placed{color:var(--green);cursor:default}.completion-flash{position:absolute;inset:0;background:var(--bg-green);opacity:0;pointer-events:none}.is-complete .completion-flash{animation:completion-flash 800ms ease-out}@keyframes completion-flash{0%,100%{opacity:0}32%{opacity:.65}}.not-found-controls{display:flex;align-items:center;justify-content:space-between;gap:20px}.not-found-controls p{max-width:75ch;color:var(--muted);font-size:.82rem}.not-found-quote{position:absolute;z-index:5;bottom:60px;left:50%;width:min(100%,var(--reading-width));max-height:62dvh;margin:0;padding:18px 22px;border-left:2px solid var(--orange);background:var(--bg0);opacity:0;visibility:hidden;transform:translateX(-50%)}.not-found-quote blockquote{margin:0}.not-found-quote blockquote p{margin-bottom:16px;font-size:clamp(.95rem,2.5vw,1.25rem);line-height:1.55}.not-found-quote footer{color:var(--muted);font:.75rem var(--mono)}.not-found-home{display:inline-flex;min-height:44px;flex:0 0 44px;align-self:flex-start;align-items:center;color:var(--green);font:.78rem var(--mono);text-decoration:none}.not-found-noscript{margin-top:22px;color:var(--muted)}@keyframes quiet-reveal{from{opacity:0}to{opacity:1}}@media(hover:none),(pointer:coarse),(max-width:700px){.footer-pointer-glow,[data-shortcuts-toggle]{display:none!important}}@media(max-width:900px){:root{--header-height:108px}.nav-shell{grid-template-columns:1fr auto;grid-template-rows:58px 50px;gap:0 16px}.primary-nav{grid-row:2;grid-column:1/-1;justify-content:center;gap:clamp(18px,5vw,44px)}.nav-utilities{grid-column:2;grid-row:1}.navbar-brand{grid-column:1;grid-row:1}.hero{padding-top:calc(var(--header-height) + 54px)}.project-entry{grid-template-columns:32px minmax(0,1fr)}.entry-aside{display:flex;grid-column:2;align-items:center;justify-content:space-between;text-align:left;gap:18px}.entry-status{margin:0}.entry-aside .entry-links{justify-content:flex-start}}@media(max-width:700px){.visual-test-grid{grid-template-columns:1fr;gap:36px}.not-found-controls{align-items:flex-start;flex-direction:column}.page-width,.nav-shell,.footer-inner{width:min(calc(100% - 36px),var(--content-width))}.hero-grid{grid-template-columns:1fr;gap:42px}.hero-portrait{width:min(58vw,210px)}.hero h1{font-size:clamp(2.05rem,9.8vw,3.35rem)}.intro-landscape{margin-top:60px}.intro-landscape img{height:280px}.section-heading{grid-template-columns:1fr;margin-bottom:28px;gap:20px}.section-heading>p{max-width:50ch}.entry{padding-block:26px}.blog-entry{grid-template-columns:1fr;gap:10px}.read-link{display:none}.publication-entry{grid-template-columns:1fr;gap:8px}.publication-year{margin:0}.entry-aside{grid-column:2;flex-wrap:wrap}.footer-inner{flex-direction:column;align-items:flex-start;justify-content:center}}@media(max-width:390px){.primary-nav{justify-content:space-between;gap:8px}.primary-nav a{font-size:.74rem}.primary-nav kbd{display:none}.project-entry{grid-template-columns:1fr;gap:8px}.project-entry .entry-index{display:none}.entry-aside{grid-column:1}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.key-flash,.footer-pointer-glow{display:none}}