:root{--g-paper:#E4E5DF;--g-ink:#171717;--g-font-display:StMarie,serif;--g-font-ui:Martian,monospace;--g-font-width:100%;--g-font-width-text:87.5%;--g-space-unit:4px;--g-space-tight:8px;--g-space-control-x:16px;--g-space-card:24px;--g-space-content:24px;--g-space-section:80px;--g-space-compact:12px;--g-space-group:32px;--g-space-block:48px;--g-space-wide:64px;--g-space-contact:96px;--g-page-desktop:32px;--g-page-mobile:24px;--g-radius:4px;--g-border:1px;--g-focus:2px;--g-touch-target:44px;--g-control-height:48px;--g-icon:16px;--g-icon-large:20px;--g-brand:28px;--g-focus-offset:3px;--g-scrollbar:8px;--g-icon-stroke:1.5;--g-content-max:1200px;--g-disabled-opacity:0.38;--g-spinner-size:12px;--g-spinner-stroke:1.5px;--g-motion-s:160ms;--g-motion-m:280ms;--g-motion-l:480ms;--g-motion-ease:cubic-bezier(0.25,1,0.5,1);--g-motion-shift-s:4px;--g-motion-shift-l:16px;--g-motion-stagger:60ms;--g-motion-dialog-scale:0.98;--g-motion-spinner:800ms;--g-motion-spinner-ease:linear;--g-motion-press-y:1px;--g-motion-link-x:2px;--g-motion-link-y:-2px;--g-motion-icon-scale:0.6;--g-motion-feedback:1600ms;--g-motion-letters-rise:450ms;--g-motion-letters-return:650ms;--g-motion-letters-stagger:40ms;--g-motion-letters-y:-20px;--g-motion-letters-rotation:-12deg;--g-motion-letters-ease:outExpo;--g-motion-logo-draw:800ms;--g-motion-logo-fill:200ms;--g-motion-logo-exit:120ms;--g-motion-logo-ease:cubic-bezier(0.16,1,0.3,1);--g-motion-not-found:1100ms;--g-motion-not-found-row-stagger:40ms;--g-motion-not-found-digit-stagger:60ms;--g-motion-not-found-ease:cubic-bezier(0.22,1,0.36,1);--g-layer-header:30;--g-layer-intro:9999;--g-layer-skip-link:10000;--g-reference-header:72px;--g-reference-header-mobile:64px;--g-logo-size:128px;--g-header:80px;--g-header-mobile:128px;--g-header-compact:176px;--g-text-measure:70ch;--g-layout-columns:3;--g-card-media-ratio:1/1;--g-card-thumbnail:96px;--g-card-thumbnail-mobile:72px;--g-menu-max-height:260px;--g-skill-text-max-height:560px;--g-source-code-height:400px;--g-dialog-inset:16px;--g-dialog-backdrop-opacity:60%;--g-type-display:80px;--g-leading-display:88px;--g-weight-display:100;--g-tracking-display:-0.025em;--g-type-title:40px;--g-leading-title:46px;--g-weight-title:100;--g-tracking-title:-0.025em;--g-type-heading:32px;--g-leading-heading:42px;--g-weight-heading:500;--g-tracking-heading:-0.03em;--g-type-body:16px;--g-leading-body:26px;--g-weight-body:400;--g-tracking-body:0;--g-type-caption:13px;--g-leading-caption:20px;--g-weight-caption:400;--g-tracking-caption:0;--g-type-control:13px;--g-leading-control:20px;--g-weight-control:500;--g-tracking-control:0}:root,[data-theme=light]{--g-background:#E4E5DF;--g-text:#171717;--g-line:#A7A7A7;--g-muted:#555555;--g-surface:#D3D3D3;--ds-primary-hover:#3D3D3D;--ds-primary-pressed:#555555;--ds-secondary-hover:#C4C4C4;--ds-secondary-pressed:#B9B9B9;--ds-filter-hover:#B9B9B9;--ds-filter-pressed:#A7A7A7;--g-ramp-0:#D3D3D3;--g-ramp-1:#B9B9B9;--g-ramp-2:#8C8C8C;--g-ramp-3:#5F5F5F;--g-ramp-4:#171717;color-scheme:light}[data-theme=dark]{--g-background:#171717;--g-text:#E4E5DF;--g-line:#545454;--g-muted:#B9B9B9;--g-surface:#272727;--ds-primary-hover:#B9B9B9;--ds-primary-pressed:#A7A7A7;--ds-secondary-hover:#3D3D3D;--ds-secondary-pressed:#545454;--ds-filter-hover:#484848;--ds-filter-pressed:#545454;--g-ramp-0:#272727;--g-ramp-1:#484848;--g-ramp-2:#747474;--g-ramp-3:#A7A7A7;--g-ramp-4:#E4E5DF;color-scheme:dark}@media (max-width:1023px){:root{--g-layout-columns:2}}@media (max-width:720px){:root{--g-type-display:48px;--g-leading-display:54px;--g-type-heading:26px;--g-leading-heading:36px;--g-space-section:48px;--g-layout-columns:1}}.action-control{box-sizing:border-box;position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--g-space-tight);height:var(--g-control-height);min-height:var(--g-control-height);padding:0 var(--g-space-control-x);border:0;border-radius:var(--g-radius);background:transparent;color:inherit;font:var(--g-weight-body) var(--g-type-control)/var(--g-leading-control) var(--g-font-ui);text-decoration:none;white-space:nowrap;cursor:pointer}.action-control:before{content:"";position:absolute;inset:0;pointer-events:none;border:var(--g-border) solid var(--g-line);border-radius:inherit}.action-control[data-priority=primary]{font-weight:var(--g-weight-control)}.action-control[data-priority=primary]:before{border-color:currentColor}.action-control[data-icon-only]{width:var(--g-control-height);padding:0}.action-control:not(:disabled):is(:hover,[data-state=hover]):before{border-color:currentColor}.action-control:is(:focus-visible,[data-state=focus]){outline:0!important}.action-control:is(:focus-visible,[data-state=focus]):before{border:var(--g-focus) solid}.action-control:not(:disabled):is(:active,[data-state=pressed]){transform:translateY(var(--g-motion-press-y))}.action-control:disabled{opacity:var(--g-disabled-opacity);cursor:default}.action-control[aria-busy=true]{opacity:1;cursor:progress}.action-control svg{width:var(--g-icon);height:var(--g-icon);fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke);flex:none}.action-spinner{width:var(--g-spinner-size);height:var(--g-spinner-size);border-right-color:currentcolor;border:var(--g-spinner-stroke) solid;border-right:var(--g-spinner-stroke) solid transparent;border-radius:50%;animation:gajsin-spin var(--g-motion-spinner) var(--g-motion-spinner-ease) infinite}.icon-control,.theme-toggle{box-sizing:border-box;display:inline-grid;place-items:center;flex:none;width:var(--g-control-height);height:var(--g-control-height);min-height:var(--g-control-height);padding:0;border:0;border-radius:var(--g-radius);background:transparent;color:inherit;cursor:pointer}.icon-control svg,.theme-toggle svg{display:block;width:var(--g-icon-large);height:var(--g-icon-large);fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke)}.icon-control:focus-visible,.theme-toggle:focus-visible{outline:var(--g-focus) solid currentColor;outline-offset:2px}.external-link{display:inline-flex;align-items:center;gap:var(--g-space-tight);min-height:var(--g-control-height);color:inherit;text-decoration:none;font:var(--g-weight-body) var(--g-type-control)/var(--g-leading-control) var(--g-font-ui)}.external-link svg{width:var(--g-icon);height:var(--g-icon);fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke);transition:transform var(--g-motion-s) var(--g-motion-ease)}.external-link:hover svg{transform:translate(var(--g-motion-link-x),var(--g-motion-link-y))}.external-link:focus-visible{outline:var(--g-focus) solid currentColor;outline-offset:var(--g-space-unit);border-radius:var(--g-radius)}@keyframes gajsin-spin{to{transform:rotate(1turn)}}@media(prefers-reduced-motion:reduce){.external-link svg{transition:none}.action-spinner{animation:none;border-right-style:dotted}}.action-control:not([data-priority=primary]):before{border-color:var(--g-muted)}.action-control:not([data-priority=primary]):not(:disabled):is(:hover,[data-state=hover]){background:var(--ds-secondary-hover)}.action-control:not([data-priority=primary]):not(:disabled):is(:hover,[data-state=hover]):before{border-color:var(--g-text)}.action-control:not([data-priority=primary]):not(:disabled):is(:active,[data-state=pressed]){background:var(--ds-secondary-pressed)}.action-control[data-priority=primary]{background:var(--g-text);color:var(--g-background)}.action-control[data-priority=primary]:before{border:0}.action-control[data-priority=primary]:not(:disabled):is(:hover,[data-state=hover]){background:var(--ds-primary-hover)}.action-control[data-priority=primary]:not(:disabled):is(:active,[data-state=pressed]){background:var(--ds-primary-pressed)}.action-control[data-priority=primary]:is(:focus-visible,[data-state=focus]){outline:var(--g-focus) solid var(--g-text)!important;outline-offset:var(--g-focus-offset)}.action-control[data-priority=primary]:is(:focus-visible,[data-state=focus]):before{border:0}.action-control:not([data-priority=primary]):is(:focus-visible,[data-state=focus]):before{border-color:var(--g-text)}.icon-control:hover,.theme-toggle:hover{background:var(--g-surface)}.external-link:hover{text-decoration:underline}html[data-theme-reveal] .site-header,html[data-theme-reveal] body{transition:none}html[data-theme-reveal]::view-transition-new(root),html[data-theme-reveal]::view-transition-old(root){animation:none;mix-blend-mode:normal}html[data-theme-reveal]::view-transition-old(root){z-index:1}html[data-theme-reveal]::view-transition-new(root){z-index:2}@font-face{font-family:Martian;src:url(/fonts/MartianMono-Variable.woff2) format("woff2");font-weight:100 800;font-stretch:75% 112.5%;font-display:swap}@font-face{font-family:Martian Mono;src:url(/fonts/MartianMono-Variable.woff2) format("woff2");font-weight:100 800;font-stretch:75% 112.5%;font-display:swap}@font-face{font-family:StMarie;src:url(/fonts/StMarie-Thin.woff2) format("woff2");font-weight:100;font-display:swap}*{box-sizing:border-box}html{height:100%;font-stretch:var(--g-font-width);--header-height:calc(var(--g-header) + env(safe-area-inset-top,0px));--page-space:var(--g-page-desktop);--page-gutter:max(var(--page-space),env(safe-area-inset-left,0px),env(safe-area-inset-right,0px));scroll-behavior:smooth;scroll-padding-top:calc(var(--header-height) + var(--g-space-control-x));scrollbar-gutter:stable}::-webkit-scrollbar{width:var(--g-scrollbar);height:var(--g-scrollbar)}::-webkit-scrollbar-corner,::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{border:var(--g-focus) solid transparent;border-radius:var(--g-radius);background:var(--g-line) padding-box}::-webkit-scrollbar-thumb:hover{background-color:var(--g-muted)}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin;scrollbar-color:var(--g-line) transparent}}body{margin:0;min-height:100svh;display:flex;flex-direction:column;background:var(--g-background);color:var(--g-text);font:var(--g-weight-body) var(--g-type-body)/var(--g-leading-body) var(--g-font-ui);-webkit-font-smoothing:antialiased;transition:background-color var(--g-motion-l) var(--g-motion-ease),color var(--g-motion-l) var(--g-motion-ease)}::selection{background:var(--g-text);color:var(--g-background)}a{color:inherit;text-underline-offset:5px}button,input,textarea{font:inherit;color:inherit}code{font:inherit}button{cursor:pointer}button:disabled{cursor:default}a,button,input,summary,textarea{-webkit-tap-highlight-color:transparent}button{background:none}img,svg{display:block}img{max-width:100%;height:auto}dd,dl,figure,h1,h2,h3,p{margin:0}dd,figcaption,li,p{text-wrap:pretty}h1,h2{font-size:var(--g-type-heading);line-height:var(--g-leading-heading);font-weight:var(--g-weight-heading);letter-spacing:var(--g-tracking-heading);text-wrap:balance}h3{font-size:var(--g-type-body);line-height:var(--g-leading-body);font-weight:var(--g-weight-control)}a:focus-visible,button:focus-visible,canvas:focus-visible,input:focus-visible,summary:focus-visible,textarea:focus-visible{outline:var(--g-focus) solid var(--g-text);outline-offset:var(--g-focus-offset);border-radius:var(--g-radius)}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap;border:0}.skip-link{position:fixed;top:8px;left:24px;z-index:var(--g-layer-skip-link);padding:var(--g-space-compact) var(--g-space-control-x);background:var(--g-text);color:var(--g-background);transform:translateY(-160%)}.skip-link:focus{transform:none}.page-container{width:min(var(--g-content-max),calc(100% - 2 * var(--page-gutter)));margin-inline:auto}.page-heading{display:grid;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x);margin-bottom:var(--g-space-block)}.page-heading p,.section-heading p{color:var(--g-muted);max-width:65ch}.muted{color:var(--g-muted)}.site-header{position:-webkit-sticky;position:sticky;z-index:var(--g-layer-header);top:0;height:var(--header-height);padding-top:env(safe-area-inset-top,0);background:var(--g-background);transition:background-color var(--g-motion-l) var(--g-motion-ease),color var(--g-motion-l) var(--g-motion-ease)}.site-header-inner{display:flex;align-items:center;gap:var(--g-space-content);height:100%;width:min(var(--g-content-max),calc(100% - 2 * var(--page-gutter)));margin:auto}.site-brand{display:grid;place-items:center start;min-width:var(--g-control-height);min-height:var(--g-control-height);margin-right:auto}.site-brand svg{width:var(--g-brand);height:var(--g-brand);fill:currentColor}.site-header nav{display:flex;align-items:center;gap:var(--g-space-content)}.site-header nav a{display:flex;align-items:center;min-height:var(--g-control-height);font-size:var(--g-type-caption);line-height:var(--g-leading-caption);text-decoration:none;white-space:nowrap}.site-header nav a:hover{text-decoration:underline}.site-header nav a[aria-current=page]{font-weight:var(--g-weight-control)}.theme-toggle{position:relative;touch-action:none}.theme-toggle>span{display:block}.site-header .theme-toggle{justify-self:end;-webkit-margin-end:calc((20px - var(--g-control-height))/2);margin-inline-end:calc((20px - var(--g-control-height))/2)}body>main{flex:1 0 auto}.site-footer{justify-content:space-between;align-items:center;width:min(var(--g-content-max),calc(100% - 2 * var(--page-gutter)));margin:var(--g-space-section) auto 0;padding-block:var(--g-space-card);padding-bottom:max(var(--g-space-card),env(safe-area-inset-bottom,0px));border-top:var(--g-border) solid var(--g-line);font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.site-footer,.site-footer>div{display:flex;gap:var(--g-space-content);flex-wrap:wrap}.site-footer a{display:inline-flex;align-items:center;min-height:var(--g-control-height);text-decoration:none}.site-footer a:hover{text-decoration:underline}body:has(main[data-portrait-state]) .site-footer{display:none}.about-page,.catalogue,.lab-page,.project-detail,.resume-page{padding-top:var(--g-space-block)}.action-control[aria-pressed=true]{background:var(--g-surface);font-weight:var(--g-weight-control)}.action-control[aria-pressed=true]:before{border-color:var(--g-text)}.external-link{font-family:var(--g-font-ui)}.catalogue-toolbar{display:flex;gap:var(--g-space-control-x);align-items:center}.search-field{position:relative;flex:1 1;min-width:160px}.search-field>svg{position:absolute;top:calc((var(--g-control-height) - var(--g-icon)) / 2);left:var(--g-space-control-x);width:var(--g-icon);height:var(--g-icon);fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke);pointer-events:none}.search-field input{width:100%;height:var(--g-control-height);padding:0 var(--g-space-control-x) 0 calc(var(--g-space-control-x) + var(--g-icon) + var(--g-space-tight));border:var(--g-border) solid var(--g-muted);border-radius:var(--g-radius);background:var(--g-surface);font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.search-field input::placeholder{color:var(--g-muted)}.search-field input:hover{background:var(--g-background);border-color:var(--g-text)}.search-field input:focus-visible{outline:0;border:var(--g-focus) solid var(--g-text);background:var(--g-background);padding-left:calc(var(--g-space-control-x) + var(--g-icon) + var(--g-space-tight) + var(--g-border) - var(--g-focus))}.select-trigger>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.category-select{position:relative;min-width:190px}.category-select,.select-trigger{font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.select-trigger{display:flex;align-items:center;justify-content:space-between;gap:var(--g-space-tight);min-height:var(--g-control-height);padding:0 var(--g-space-control-x);width:100%;border:var(--g-border) solid var(--g-muted);border-radius:var(--g-radius);background:var(--g-surface);text-align:left}.select-trigger:hover{background:var(--ds-filter-hover);border-color:var(--g-text)}.select-trigger[aria-expanded=true]{background:var(--ds-filter-pressed)}.select-trigger:focus-visible,.select-trigger[aria-expanded=true]{outline:0;border:var(--g-focus) solid var(--g-text);padding-inline:calc(var(--g-space-control-x) + var(--g-border) - var(--g-focus))}.select-trigger svg{width:var(--g-icon);height:var(--g-icon);flex:none;fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke)}.select-trigger[aria-expanded=true] svg{transform:rotate(180deg)}.select-list{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;min-width:100%;max-width:calc(100vw - 48px);max-height:var(--g-menu-max-height);overflow:auto;padding:var(--g-space-unit);border:var(--g-border) solid var(--g-muted);border-radius:var(--g-radius);background:var(--g-background)}.category-select[data-side=top] .select-list{top:auto;bottom:calc(100% + 8px);animation-name:popover-up}@keyframes popover-down{0%{opacity:0;transform:translateY(calc(var(--g-motion-shift-s) * -1))}}@keyframes popover-up{0%{opacity:0;transform:translateY(var(--g-motion-shift-s))}}@keyframes popover-out-down{to{opacity:0;transform:translateY(calc(var(--g-motion-shift-s) * -1))}}@keyframes popover-out-up{to{opacity:0;transform:translateY(var(--g-motion-shift-s))}}.select-list{animation:popover-down var(--g-motion-s) var(--g-motion-ease)}.select-list[data-closing]{animation:popover-out-down var(--g-motion-s) var(--g-motion-ease) forwards;pointer-events:none}.category-select[data-side=top] .select-list[data-closing]{animation-name:popover-out-up}.select-list [role=option]{display:flex;gap:var(--g-space-control-x);align-items:center;min-height:var(--g-control-height);padding:var(--g-space-compact) var(--g-space-control-x);border-radius:var(--g-radius);cursor:pointer}.select-list [role=option]>span:first-child{flex:1 1}.select-count{color:var(--g-muted);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.select-list [data-active=true] .select-count{color:inherit}.select-list svg{flex:none;width:var(--g-icon);height:var(--g-icon);fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke);opacity:0}.select-list [aria-selected=true] svg{opacity:1}.select-list [data-active=true]{background:var(--g-text);color:var(--g-background)}.view-controls{display:flex;gap:var(--g-space-tight)}.catalogue-count{margin-block:var(--g-space-card);font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.project-grid{display:grid;grid-template-columns:repeat(var(--g-layout-columns),minmax(0,1fr));grid-gap:var(--g-space-content);gap:var(--g-space-content)}.project-card{display:flex;flex-direction:column;min-width:0;border:var(--g-border) solid var(--g-line);border-radius:var(--g-radius);text-decoration:none;overflow:hidden}.project-card:hover{border-color:var(--g-text);background:var(--g-surface)}.project-cover{aspect-ratio:var(--g-card-media-ratio);overflow:hidden;background:var(--g-surface);container-type:inline-size}.project-cover img{width:100%;height:100%;object-fit:cover}.project-card-body{flex:1 1;display:flex;flex-direction:column;gap:var(--g-space-content);padding:var(--g-space-card);min-width:0}.project-card-title{display:grid;grid-template-columns:minmax(0,1fr) var(--g-icon);align-items:start;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x)}.project-card-title h2{font:var(--g-weight-title) var(--g-type-title)/var(--g-leading-title) var(--g-font-display);overflow-wrap:anywhere;letter-spacing:var(--g-tracking-title)}.project-card-title svg{width:var(--g-icon);height:var(--g-icon);flex:none;fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke);margin-top:var(--g-space-compact)}.project-card-body>p{overflow-wrap:anywhere}.project-card-body>p,.project-card-meta{font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.project-card-meta{margin-top:auto;display:flex;justify-content:space-between;gap:var(--g-space-control-x);color:var(--g-muted)}.project-card-categories>span+span,.project-card-stack{display:none}.project-card-categories>span+span:before{content:" · "}.project-grid[data-moving]{overflow-x:clip}.project-grid[data-layout=list]{grid-template-columns:1fr;gap:var(--g-space-tight)}.project-grid[data-layout=list] .project-card{display:grid;grid-template-columns:var(--g-card-thumbnail) minmax(0,1fr)}.project-grid[data-layout=list] .project-cover{align-self:start}.project-grid[data-layout=list] .project-card-body{display:grid;grid-template-columns:minmax(0,240px) minmax(0,1fr) minmax(0,320px);align-items:center;grid-gap:var(--g-space-tight) var(--g-space-content);gap:var(--g-space-tight) var(--g-space-content);padding:var(--g-space-control-x) var(--g-space-card)}.project-grid[data-layout=list] .project-card-title{display:block}.project-grid[data-layout=list] .project-card-title svg{display:none}.project-grid[data-layout=list] .project-card-meta{margin:0;display:grid;grid-gap:var(--g-space-unit);gap:var(--g-space-unit)}.project-grid[data-layout=list] .project-card-categories>span+span{display:inline}.project-grid[data-layout=list] .project-card-stack{display:block}.type-cover{height:100%;display:flex;flex-direction:column;padding:9cqw 6.4cqw 6cqw;background:var(--g-ink);color:var(--g-paper);font-family:var(--g-font-ui)}html[data-theme=dark] .type-cover{background:var(--g-surface)}.type-cover-title{font-size:8.4cqw;line-height:1;font-weight:var(--g-weight-control);letter-spacing:-.03em;text-transform:uppercase;overflow-wrap:anywhere}.type-cover-rule{width:4.2cqw;height:.32cqw;margin-top:3cqw;background:currentColor}.type-cover-category{margin-top:2.8cqw;font-size:2.4cqw;line-height:1.3;opacity:.7}.type-cover-stack{list-style:none;height:60%;margin:auto 0 0;padding:4cqw;display:grid;align-content:start;grid-gap:1.6cqw;gap:1.6cqw;border:var(--g-border) solid color-mix(in srgb,var(--g-paper) 22%,transparent);border-radius:var(--g-radius);font-size:3.2cqw;line-height:1.3;counter-reset:stack}.type-cover-stack li{display:flex;gap:3cqw;counter-increment:stack}.type-cover-stack li:before{content:counter(stack,decimal-leading-zero);opacity:.5}.source-body,details[data-animating]{overflow:clip}details[data-animating]{overflow-anchor:none}.disclosure-mark{flex:none;display:block;width:var(--g-icon);height:var(--g-icon);fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke)}.disclosure-mark-stem{transform-box:fill-box;transform-origin:center;transition:transform var(--g-motion-l) var(--g-motion-ease)}details[open]:not([data-state=closed])>summary .disclosure-mark-stem{transform:scaleY(0)}[data-reveal-pending]{opacity:0}@media print{[data-reveal-pending]{opacity:1!important}}@keyframes content-in{0%{opacity:0;transform:translateY(var(--g-motion-shift-l))}}.experiment-heading[data-swap],.lab-panel[data-swap],.source-code textarea[data-swap],.tool-readout ul[data-swap]{animation:content-in var(--g-motion-m) var(--g-motion-ease) backwards}.action-label[data-swap]{animation:popover-up var(--g-motion-m) var(--g-motion-ease) backwards}.project-card{transition:background-color var(--g-motion-s) var(--g-motion-ease),border-color var(--g-motion-s) var(--g-motion-ease)}.project-card-title svg{transition:transform var(--g-motion-s) var(--g-motion-ease)}.project-card:hover .project-card-title svg{transform:translateX(var(--g-motion-link-x))}@keyframes icon-in{0%{opacity:0;transform:scale(var(--g-motion-icon-scale))}}.icon-control[data-done] svg{animation:icon-in var(--g-motion-s) var(--g-motion-ease)}.empty-state{display:grid;justify-items:start;align-content:start;grid-gap:var(--g-space-content);gap:var(--g-space-content);padding-block:var(--g-space-section)}.about-scene{position:relative;isolation:isolate;background:var(--g-paper);color:var(--g-ink)}.about-scene>img{width:100%;object-fit:contain}.about-copy{position:absolute;top:50%;left:32px;width:42%;transform:translateY(-50%);display:grid;grid-gap:var(--g-space-content);gap:var(--g-space-content)}.about-copy p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.about-copy .external-link{color:var(--g-ink);justify-self:start}.approach{grid-template-columns:1fr 1fr;margin-top:var(--g-space-section);align-items:center}.approach,.approach>div:first-child{display:grid;grid-gap:var(--g-space-content);gap:var(--g-space-content)}.approach .effect-frame{height:420px}.section-heading{display:grid;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x);margin-bottom:var(--g-space-group)}.tools-section{margin-top:var(--g-space-section)}.tools-map{display:grid;grid-template-columns:minmax(0,2fr) minmax(200px,1fr);grid-gap:var(--g-space-group);gap:var(--g-space-group)}.tools-map>.effect-frame{height:480px;min-width:0}.tool-readout{padding-left:var(--g-space-card);border-left:var(--g-border) solid var(--g-line);display:grid;align-content:start;grid-gap:var(--g-space-content);gap:var(--g-space-content)}.tool-readout p{font-size:var(--g-type-caption);color:var(--g-muted);margin-top:var(--g-space-tight)}.tool-readout ul{list-style:none;padding:0;margin:0;display:grid;align-content:start;grid-gap:var(--g-space-unit);gap:var(--g-space-unit);font-size:var(--g-type-caption);min-height:0;overflow-y:auto;overscroll-behavior:contain}.tool-readout a{display:flex;align-items:center;min-height:var(--g-touch-target)}.tools-index{margin-top:var(--g-space-card);border-top:var(--g-border) solid var(--g-line);padding-top:var(--g-space-control-x);font-size:var(--g-type-caption)}.source-code>summary,.tools-index>summary{cursor:pointer;min-height:var(--g-control-height);display:flex;align-items:center;justify-content:flex-start;gap:var(--g-space-control-x);list-style:none}.source-code>summary::-webkit-details-marker,.tools-index>summary::-webkit-details-marker{display:none}.tools-index-list{list-style:none;padding:0;margin:var(--g-space-control-x) 0 0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-gap:var(--g-space-tight) var(--g-space-content);gap:var(--g-space-tight) var(--g-space-content)}.tools-index-list>li{min-width:0;align-self:start}.tool-index-entry>summary{width:100%;min-height:var(--g-control-height);border:0;border-bottom:var(--g-border) solid var(--g-line);padding:var(--g-space-compact) var(--g-space-tight);display:flex;align-items:center;justify-content:space-between;gap:var(--g-space-control-x);text-align:left;font-size:var(--g-type-caption)}.tool-index-entry[data-selected]>summary{font-weight:var(--g-weight-control);background:var(--g-surface)}.tool-index-entry>summary:hover{background:var(--g-surface)}.tool-index-entry>summary{list-style:none;line-height:var(--g-leading-caption)}.tool-count{color:var(--g-muted);white-space:nowrap;font-size:var(--g-type-caption)}.tool-projects{list-style:none;padding:var(--g-space-tight);margin:0;display:grid;grid-gap:var(--g-space-unit);gap:var(--g-space-unit);background:var(--g-surface)}.tool-projects a{display:flex;align-items:center;min-height:var(--g-touch-target);font-size:var(--g-type-caption)}.effect-frame{position:relative;display:grid;grid-template-rows:minmax(0,1fr);min-width:0;min-height:200px}.effect-host{width:100%;height:100%;position:relative;overflow:hidden;color:var(--g-text);transition:opacity var(--g-motion-m) var(--g-motion-ease)}.effect-host[aria-busy=true]{opacity:0}.effect-host>div{width:100%;height:100%;min-height:100%!important;background:var(--g-background)!important;color:var(--g-text)!important}.effect-host canvas{max-width:100%}.effect-host button{font-family:var(--g-font-ui)}.effect-host[data-effect=activity]>div{max-width:none!important;border:0!important;border-radius:0!important;--terrain-0:var(--g-ramp-0)!important;--terrain-1:var(--g-ramp-1)!important;--terrain-2:var(--g-ramp-2)!important;--terrain-3:var(--g-ramp-3)!important;--terrain-4:var(--g-ramp-4)!important;--terrain-accent:var(--g-text)!important;--terrain-text:var(--g-muted)!important;font-family:var(--g-font-ui)!important}.effect-host .portfolio-terrain>div:first-child{padding:0!important;gap:var(--g-space-control-x)!important;flex-wrap:wrap}.effect-host .portfolio-terrain>div:first-child>div:last-child{background:none!important;padding:0!important;gap:var(--g-space-tight)}.effect-host .portfolio-terrain p{color:var(--g-muted)!important;font-size:var(--g-type-caption)!important;line-height:var(--g-leading-caption)!important}.effect-host .portfolio-terrain canvas{height:300px!important;width:100%!important;border-radius:0!important}.effect-host .portfolio-terrain>div:last-child{color:var(--g-muted)!important}.effect-status{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--g-space-content);padding:var(--g-space-card);background:var(--g-background);font-size:var(--g-type-caption);line-height:var(--g-leading-caption);text-align:center}.effect-status p{max-width:50ch}.effect-loading{position:absolute;left:24px;bottom:24px;pointer-events:none;font-size:var(--g-type-caption);color:var(--g-muted)}.contact-page{position:relative;isolation:isolate;min-height:calc(100svh - var(--header-height));display:grid;align-items:center;overflow:hidden}.contact-background{position:absolute;inset:0;z-index:0}.contact-background .effect-frame{display:block;width:100%;height:100%}.contact-background .effect-status{align-items:flex-end;justify-content:flex-end;padding:var(--g-space-card)}.contact-background .effect-host{-webkit-mask-image:linear-gradient(90deg,transparent 5%,#0003 35%,#000 75%);mask-image:linear-gradient(90deg,transparent 5%,#0003 35%,#000 75%)}.contact-copy{position:relative;z-index:1;padding-block:var(--g-space-contact);pointer-events:none}.contact-copy>*{max-width:650px;pointer-events:auto}.contact-copy h1{margin-bottom:var(--g-space-card);overflow:visible}.contact-copy p{margin-bottom:var(--g-space-group);max-width:55ch}.contact-email{display:inline-flex;align-items:center;gap:var(--g-space-unit)}.contact-copy .contact-status{min-height:20px;margin:var(--g-space-tight) 0 0}.contact-copy .contact-employer,.contact-copy .contact-status{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.contact-copy .contact-employer{margin:var(--g-space-control-x) 0 0}.contact-employer a{color:var(--g-text)}.contact-primary{display:inline;font-size:var(--g-type-heading);line-height:var(--g-leading-heading);text-decoration:none}.contact-primary:hover{text-decoration:underline}.contact-links{display:flex;gap:var(--g-space-content);margin-top:var(--g-space-card)}.component-previews{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x);margin-bottom:var(--g-space-group)}.component-previews button{min-width:0;display:grid;grid-template-columns:112px minmax(0,1fr);align-items:center;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x);padding:var(--g-space-tight);border:var(--g-border) solid var(--g-line);border-radius:var(--g-radius);text-align:left;font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.component-previews img{width:100%;aspect-ratio:8/5;object-fit:contain;background:var(--g-background);border-radius:0}html:not([data-theme=dark]) .component-previews img[data-preview-theme=dark],html[data-theme=dark] .component-previews img[data-preview-theme=light]{display:none}.component-previews span{overflow-wrap:anywhere}.component-previews button:hover{background:var(--g-surface);border-color:var(--g-text)}.component-previews button[aria-pressed=true]{outline:var(--g-focus) solid var(--g-text);outline-offset:-2px;border-color:transparent;background:var(--g-surface);font-weight:var(--g-weight-control)}.component-previews button:focus-visible{outline:var(--g-focus) solid var(--g-text);outline-offset:var(--g-focus-offset)}.experiment-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--g-space-content);margin-bottom:var(--g-space-card)}.experiment-heading>div{display:grid;grid-gap:var(--g-space-tight);gap:var(--g-space-tight)}.experiment-heading>a{flex:none}.experiment-heading p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted);max-width:55ch}.experiment-stage{height:clamp(380px,64svh,760px);background:var(--g-background)}.lab-page .effect-host{touch-action:pan-y}.source-code{margin-top:var(--g-space-group);border-top:var(--g-border) solid var(--g-line);padding-block:var(--g-space-control-x)}.source-info{grid-gap:var(--g-space-unit);gap:var(--g-space-unit);margin-block:var(--g-space-card)}.source-info,.source-setup{display:grid;font-size:var(--g-type-caption)}.source-setup{grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x)}.source-setup,.source-setup h3{line-height:var(--g-leading-caption)}.source-setup h3{font-size:var(--g-type-caption)}.source-setup ol{margin:0;padding-left:var(--g-space-card);display:grid;grid-gap:var(--g-space-tight);gap:var(--g-space-tight)}.source-commands{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:var(--g-space-control-x);padding:var(--g-space-control-x);background:var(--g-surface);border-radius:var(--g-radius)}.source-commands pre{margin:0;max-width:100%;overflow-x:auto;font:var(--g-type-caption)/var(--g-leading-caption) var(--g-font-ui)}.source-files{display:flex;gap:var(--g-space-tight);overflow-x:auto;margin-block:var(--g-space-card)}.source-files button{padding:var(--g-space-compact) var(--g-space-control-x);min-height:var(--g-control-height);border:0;border-bottom:var(--g-border) solid var(--g-line);white-space:nowrap;font-size:var(--g-type-caption)}.source-files button[aria-pressed=true]{border-color:var(--g-text);font-weight:var(--g-weight-control)}.code-toolbar{display:flex;justify-content:space-between;align-items:center;gap:var(--g-space-control-x);font-size:var(--g-type-caption);margin-bottom:var(--g-space-control-x)}.source-code textarea{width:100%;height:var(--g-source-code-height);resize:vertical;border:var(--g-border) solid var(--g-line);border-radius:var(--g-radius);background:var(--g-surface);padding:var(--g-space-card);font:var(--g-type-caption)/var(--g-leading-caption) var(--g-font-ui);-moz-tab-size:2;tab-size:2;white-space:pre;overflow:auto}.source-code>[role=status]{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);margin-top:var(--g-space-tight)}.back-link{display:inline-flex;align-items:center;min-height:var(--g-control-height);font-size:var(--g-type-caption);text-decoration:none;margin-bottom:var(--g-space-group)}.back-link:hover{text-decoration:underline}.project-detail-heading{margin-bottom:var(--g-space-block)}.project-detail-heading h1{font:var(--g-weight-display) var(--g-type-display)/var(--g-leading-display) var(--g-font-display);letter-spacing:var(--g-tracking-display);overflow-wrap:anywhere;margin-bottom:var(--g-space-card)}.project-detail-copy{min-width:0}.project-detail-heading p{max-width:60ch}.project-facts{display:grid;grid-template-columns:max-content minmax(0,1fr);grid-gap:var(--g-space-tight) var(--g-space-control-x);gap:var(--g-space-tight) var(--g-space-control-x);font-size:var(--g-type-caption);line-height:var(--g-leading-caption);margin-top:var(--g-space-card)}.project-facts>div{display:contents}.project-facts dt{color:var(--g-muted)}.project-materials{display:flex;flex-wrap:wrap;gap:var(--g-space-unit) var(--g-space-control-x)}.project-materials a{min-height:0;padding-block:var(--g-space-compact);margin-block:-12px}.case-navigation{display:flex;flex-wrap:wrap;gap:var(--g-space-tight) var(--g-space-content);margin-top:var(--g-space-card);font-size:var(--g-type-caption)}.case-navigation a{display:inline-flex;align-items:center;min-height:var(--g-control-height)}.project-detail{counter-reset:case-section}.case-section h2:before,.case-story h2:before{counter-increment:case-section;content:counter(case-section,decimal-leading-zero) /"";display:inline-block;-webkit-margin-end:var(--g-space-control-x);margin-inline-end:var(--g-space-control-x);font:var(--g-weight-body) var(--g-type-caption)/var(--g-leading-caption) var(--g-font-ui);letter-spacing:0;color:var(--g-muted);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.case-gallery figcaption{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted);margin-top:var(--g-space-tight)}.case-story{display:grid;grid-gap:var(--g-space-section);gap:var(--g-space-section)}.case-story>section{display:grid;grid-template-columns:1fr 2fr;grid-gap:var(--g-space-block);gap:var(--g-space-block)}.case-story p{max-width:var(--g-text-measure)}.case-section{margin-top:var(--g-space-section);display:grid;grid-gap:var(--g-space-group);gap:var(--g-space-group)}.feature-list{display:grid;grid-template-columns:1fr 1fr;grid-gap:var(--g-space-group) var(--g-space-block);gap:var(--g-space-group) var(--g-space-block)}.feature-list>div{display:grid;align-content:start;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x);border-top:var(--g-border) solid var(--g-line);padding-top:var(--g-space-card)}.feature-list p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.architecture-list{list-style:none;padding:0;margin:0;display:grid;max-width:75ch;border-top:var(--g-border) solid var(--g-line);counter-reset:layer}.architecture-list li{counter-increment:layer;display:grid;grid-template-columns:32px 1fr;grid-column-gap:var(--g-space-control-x);column-gap:var(--g-space-control-x);padding-block:var(--g-space-compact);border-bottom:var(--g-border) solid var(--g-line);font-size:var(--g-type-caption);line-height:var(--g-leading-caption);overflow-wrap:anywhere}.architecture-list li:before{content:counter(layer,decimal-leading-zero) /"";grid-row:span 2;font:var(--g-weight-body) var(--g-type-caption)/var(--g-leading-caption) var(--g-font-ui);color:var(--g-muted);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.architecture-list span{font:var(--g-weight-control) var(--g-type-caption)/var(--g-leading-caption) var(--g-font-ui)}.stack-list{list-style:none;padding:0;margin:0;display:flex;gap:var(--g-space-tight);flex-wrap:wrap}.stack-list li{padding:var(--g-space-tight) var(--g-space-compact);background:var(--g-surface);border-radius:var(--g-radius);font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.case-gallery{gap:var(--g-space-block)}.case-presentation>p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.presentation-preview{position:relative;height:520px;overflow:hidden;border:var(--g-border) solid var(--g-line);border-radius:var(--g-radius);background:var(--g-surface)}.presentation-preview>img{display:block;width:100%;height:auto}.presentation-open{position:absolute;inset:0;display:flex;align-items:flex-end;justify-content:center;padding:var(--g-space-card);border:0;background:linear-gradient(transparent calc(100% - 160px),var(--g-background) calc(100% - 24px));cursor:pointer;font:inherit;color:inherit}.presentation-open .action-control{background:var(--g-background)}.presentation-open:focus-visible .action-control,.presentation-open:hover .action-control{background:var(--g-text);color:var(--g-background)}.presentation-open:focus-visible{outline:var(--g-focus) solid var(--g-text);outline-offset:-2px}.presentation-dialog{width:min(var(--g-content-max),calc(100vw - 2 * var(--g-dialog-inset)));height:calc(100dvh - 2 * var(--g-dialog-inset));max-width:none;max-height:none;margin:auto;padding:0;border:var(--g-border) solid var(--g-line);border-radius:var(--g-radius);background:var(--g-background);color:var(--g-text);overflow:hidden}.presentation-dialog[open]{display:grid;grid-template-rows:auto 1fr}.presentation-dialog::-webkit-backdrop{background:color-mix(in srgb,var(--g-ink) var(--g-dialog-backdrop-opacity),transparent)}.presentation-dialog::backdrop{background:color-mix(in srgb,var(--g-ink) var(--g-dialog-backdrop-opacity),transparent)}.presentation-dialog::-webkit-backdrop{-webkit-transition:opacity var(--g-motion-m) var(--g-motion-ease),transform var(--g-motion-m) var(--g-motion-ease),overlay var(--g-motion-m) allow-discrete,display var(--g-motion-m) allow-discrete;transition:opacity var(--g-motion-m) var(--g-motion-ease),transform var(--g-motion-m) var(--g-motion-ease),overlay var(--g-motion-m) allow-discrete,display var(--g-motion-m) allow-discrete}.presentation-dialog,.presentation-dialog::backdrop{transition:opacity var(--g-motion-m) var(--g-motion-ease),transform var(--g-motion-m) var(--g-motion-ease),overlay var(--g-motion-m) allow-discrete,display var(--g-motion-m) allow-discrete}.presentation-dialog:not([open])::-webkit-backdrop{opacity:0}.presentation-dialog:not([open]),.presentation-dialog:not([open])::backdrop{opacity:0}.presentation-dialog:not([open]){transform:scale(var(--g-motion-dialog-scale))}@starting-style{.presentation-dialog[open]::-webkit-backdrop{opacity:0}.presentation-dialog[open],.presentation-dialog[open]::backdrop{opacity:0}.presentation-dialog[open]{transform:scale(var(--g-motion-dialog-scale))}}.presentation-bar{display:flex;align-items:center;gap:var(--g-space-content);padding:var(--g-space-tight) var(--g-space-tight) var(--g-space-tight) var(--g-space-control-x);border-bottom:var(--g-border) solid var(--g-line);font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.presentation-bar>span{flex:1 1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.presentation-dialog>iframe{width:100%;height:100%;border:0;background:var(--g-background)}html:has(.presentation-dialog[open]){overflow:hidden}.case-gallery img{width:100%;max-height:1000px;object-fit:contain}.case-pager{display:grid;grid-template-columns:1fr 1fr;grid-gap:var(--g-space-content);gap:var(--g-space-content);margin-top:var(--g-space-section);border-top:var(--g-border) solid var(--g-line)}.case-pager a{display:grid;align-content:start;grid-gap:var(--g-space-tight);gap:var(--g-space-tight);padding-block:var(--g-space-group);text-decoration:none;min-width:0}.case-pager a+a{justify-items:end;text-align:right}.case-pager span{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.case-pager strong{font:var(--g-weight-title) var(--g-type-title)/var(--g-leading-title) var(--g-font-display);letter-spacing:var(--g-tracking-title);overflow-wrap:break-word}.case-pager a:hover strong{text-decoration:underline;text-decoration-thickness:1px}.case-bottom{display:flex;justify-content:space-between;gap:var(--g-space-content);border-top:var(--g-border) solid var(--g-line);padding-top:var(--g-space-group)}.resume-page{display:grid;grid-gap:var(--g-space-block);gap:var(--g-space-block);max-width:850px}.resume-page section{display:grid;grid-gap:var(--g-space-content);gap:var(--g-space-content)}.resume-page p{max-width:var(--g-text-measure)}.resume-links{display:flex;gap:var(--g-space-control-x);flex-wrap:wrap}@media(min-width:1500px){.page-container,.site-footer,.site-header-inner{width:var(--g-content-max)}}@media(max-width:1023px){.project-grid[data-layout=list] .project-card-body{grid-template-columns:minmax(0,200px) minmax(0,1fr)}.project-grid[data-layout=list] .project-card-title{grid-row:1/3}.site-header nav,.site-header-inner{gap:var(--g-space-control-x)}.about-copy{left:24px;width:44%}.tools-map{grid-template-columns:minmax(0,2fr) minmax(180px,1fr)}}@media(max-width:900px){.about-copy{position:static;transform:none;width:auto;padding:var(--g-space-card);gap:var(--g-space-content)}.about-scene{display:flex;flex-direction:column-reverse}.about-scene>img{width:100%;height:auto}}@media(max-width:720px){html{--header-height:calc(var(--g-header-mobile) + env(safe-area-inset-top,0px));--page-space:var(--g-page-mobile)}.page-container,.site-footer,.site-header-inner{width:calc(100% - 2 * var(--page-gutter))}.site-header-inner{display:grid;grid-template-columns:1fr 48px;grid-gap:0;gap:0;min-height:0;padding-block:var(--g-space-tight)}.site-brand{justify-self:start;margin:0}.site-header nav{grid-row:2;grid-column:1/-1;overflow-x:auto;gap:var(--g-space-tight);scrollbar-width:none}.site-header nav::-webkit-scrollbar{display:none}.site-header .theme-toggle{grid-column:2;grid-row:1}.lab-page .effect-host,.lab-page .effect-host canvas,.lab-page .effect-host>div{touch-action:pan-y pinch-zoom!important}.about-page,.catalogue,.lab-page,.project-detail,.resume-page{padding-top:var(--g-space-group)}.page-heading{margin-bottom:var(--g-space-group)}.catalogue-toolbar{flex-wrap:wrap;gap:var(--g-space-control-x)}.search-field{flex-basis:100%}.category-select{flex:1 1;min-width:0}.view-controls{flex:none}.project-grid[data-layout=list] .project-card-title h2{font-size:var(--g-type-heading);line-height:var(--g-leading-heading)}.project-grid[data-layout=list] .project-card{grid-template-columns:var(--g-card-thumbnail-mobile) minmax(0,1fr)}.project-grid[data-layout=list] .project-card-body{grid-template-columns:minmax(0,1fr);gap:var(--g-space-unit);padding:var(--g-space-compact) var(--g-space-control-x)}.project-grid[data-layout=list] .project-card-stack{display:none}.approach{grid-template-columns:1fr;gap:var(--g-space-group)}.approach .effect-frame{height:320px}.tools-map{grid-template-columns:1fr;gap:var(--g-space-content)}.tool-readout{border-left:0;border-top:var(--g-border) solid var(--g-line);padding:var(--g-space-card) 0 0}.tool-readout ul{grid-template-columns:1fr 1fr}.tools-map>.effect-frame{height:480px}.tools-index-list{grid-template-columns:1fr}.tool-index-entry>summary>span:first-child{overflow-wrap:anywhere}.contact-copy p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.contact-background .effect-host{-webkit-mask-image:linear-gradient(0deg,#000,transparent 80%);mask-image:linear-gradient(0deg,#000,transparent 80%)}.experiment-heading{display:grid;justify-items:start;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x)}.component-previews{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--g-space-tight)}.component-previews button{grid-template-columns:1fr;grid-template-rows:auto 1fr;gap:var(--g-space-tight);align-items:start}.component-previews span{padding:var(--g-space-unit);align-self:center}.experiment-stage{height:480px}.effect-host .portfolio-terrain>div:first-child{display:grid!important}.project-detail-heading{margin-bottom:var(--g-space-group)}.project-detail-heading p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.case-story>section{grid-template-columns:1fr;gap:var(--g-space-content)}.case-pager strong{font-size:var(--g-type-heading);line-height:var(--g-leading-heading)}.feature-list{grid-template-columns:1fr;gap:var(--g-space-group)}.case-bottom{flex-wrap:wrap}.case-story p{font-stretch:var(--g-font-width-text)}.code-toolbar{align-items:flex-start}.code-toolbar code{overflow-wrap:anywhere}.source-code textarea{padding:var(--g-space-control-x)}.site-footer,.site-footer>div{gap:var(--g-space-control-x)}}@media(prefers-reduced-motion:reduce){*,:after,:before{scroll-behavior:auto!important;transition:none!important;animation-duration:0s!important}.action-spinner{animation:none}}a,button,summary{touch-action:manipulation}.select-list,.source-code textarea{overscroll-behavior:contain}.catalogue-count,.project-facts,.tool-index-entry>summary,.tool-readout p{list-style:none;line-height:var(--g-leading-caption)}.tool-index-entry>summary::-webkit-details-marker{display:none}.tool-index-entry>summary>span:first-child{flex:1 1}.tool-count{font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.case-story p,.feature-list p,.project-detail-heading p{overflow-wrap:anywhere}.contact-primary svg{display:inline-block;width:24px;height:24px;-webkit-margin-start:var(--g-space-control-x);margin-inline-start:var(--g-space-control-x);vertical-align:-2px;fill:none;stroke:currentColor;stroke-width:var(--g-icon-stroke)}.tool-readout{height:480px;grid-template-rows:auto minmax(0,1fr)}.resume-heading-row{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--g-space-content);flex-wrap:wrap}.resume-heading-row h1{flex:1 1 560px}.resume-actions{display:flex;gap:var(--g-space-tight);flex-wrap:wrap}.resume-document{max-width:960px;margin-inline:auto}.resume-heading{display:grid;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x);margin-bottom:var(--g-space-block)}.resume-heading h1{font-size:var(--g-type-heading);line-height:var(--g-leading-heading)}.resume-document .role-title{font-weight:var(--g-weight-control)}.resume-document .role-desc{max-width:65ch;color:var(--g-muted)}.resume-document .contacts-grid{display:grid;grid-template-columns:1fr 1fr;grid-gap:var(--g-space-control-x) var(--g-space-group);gap:var(--g-space-control-x) var(--g-space-group);margin-top:var(--g-space-control-x)}.resume-document .contact-item{display:grid;grid-gap:var(--g-space-unit);gap:var(--g-space-unit);font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.resume-document .contact-label{color:var(--g-muted)}.resume-document section{display:grid;grid-template-columns:200px minmax(0,1fr);grid-gap:var(--g-space-group);gap:var(--g-space-group);padding-block:var(--g-space-group);border-top:var(--g-border) solid var(--g-line)}.resume-document h2{font-size:var(--g-type-body);line-height:var(--g-leading-body);letter-spacing:0}.resume-section-content{display:grid;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x);min-width:0}.resume-section-content li,.resume-section-content p{font-size:var(--g-type-body);line-height:var(--g-leading-body)}.resume-document ul{margin:0;padding-left:20px}.resume-document li+li{margin-top:var(--g-space-tight)}.resume-document .exp-header{display:grid;grid-gap:var(--g-space-tight);gap:var(--g-space-tight)}.resume-document .exp-title,.resume-document .project-name{font-weight:var(--g-weight-control)}.resume-document .exp-period{color:var(--g-muted)}.resume-document .exp-period,.resume-document .exp-role{font-size:var(--g-type-caption)}.resume-project{display:grid;grid-gap:var(--g-space-tight);gap:var(--g-space-tight);padding-block:var(--g-space-control-x)}.resume-project+.resume-project{border-top:var(--g-border) solid var(--g-line)}.resume-document .info-grid,.resume-document .project-desc,.resume-document .skills-table{font-size:var(--g-type-body);line-height:var(--g-leading-body)}.resume-document .project-stack{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.resume-document .info-grid{display:grid;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x)}.resume-document .info-item{display:grid;grid-gap:var(--g-space-unit);gap:var(--g-space-unit)}.resume-document .info-label{color:var(--g-muted)}.resume-document .skills-table{width:100%;border-collapse:collapse}.resume-document td,.resume-document th{padding:var(--g-space-compact) 0;text-align:left;vertical-align:top;border-bottom:var(--g-border) solid var(--g-line)}.resume-document th{padding-right:var(--g-space-card);font-weight:var(--g-weight-control)}.resume-document a{overflow-wrap:anywhere}.resume-document a:hover{text-decoration-thickness:2px}@media(max-width:720px){.resume-actions{justify-content:start}.resume-document section{gap:var(--g-space-content)}.resume-document .contacts-grid,.resume-document section{grid-template-columns:1fr}.contact-links{flex-wrap:wrap}.resume-document .skills-table tr{display:grid}.resume-document td,.resume-document th{border:0;padding-block:var(--g-space-unit)}.resume-document tr{padding-block:var(--g-space-tight);border-bottom:var(--g-border) solid var(--g-line)}}@media print{html{color-scheme:light!important}body{background:#fff!important;color:#171717!important;font-size:11pt}.resume-actions,.site-footer,.site-header,.skip-link,[data-logo-intro]{display:none!important}.resume-page{padding:0;width:100%}.resume-document,.resume-page{max-width:none}.resume-heading{margin-bottom:var(--g-space-card)}.resume-document section{grid-template-columns:136px minmax(0,1fr);gap:var(--g-space-content);padding-block:var(--g-space-control-x)}.resume-document h2{page-break-after:avoid;break-after:avoid}.resume-document .info-grid,.resume-document .skills-table{page-break-inside:avoid;break-inside:avoid}.resume-project{gap:var(--g-space-unit);padding-block:10px}.resume-document .contacts-grid{grid-template-columns:1fr 1fr}.resume-project{page-break-inside:avoid;break-inside:avoid}.resume-document .contact-label,.resume-document .exp-period,.resume-document .info-label,.resume-document .project-stack,.resume-document .role-desc{color:#555!important}.resume-document .info-grid,.resume-document .project-desc,.resume-document .skills-table,.resume-section-content li,.resume-section-content p{font-size:10pt;line-height:1.5}@page{size:A4;margin:16mm}}@media(max-width:720px){.tool-readout{height:auto;grid-template-rows:auto auto}.tool-readout ul{overflow:visible;overscroll-behavior:auto}.lab-portrait-stage{height:auto;aspect-ratio:1}.presentation-preview{height:400px}.presentation-dialog{width:100vw;height:100dvh;border:0;border-radius:0}.presentation-bar{gap:var(--g-space-control-x)}}.lab-tabs{display:flex;gap:var(--g-space-content);flex-wrap:wrap;margin-bottom:var(--g-space-block);border-bottom:var(--g-border) solid var(--g-line)}.lab-tabs button{min-height:var(--g-control-height);margin-bottom:-1px;padding:0;border:0;border-bottom:var(--g-focus) solid transparent;font-size:var(--g-type-body);line-height:var(--g-leading-body)}.lab-tabs button:hover{border-bottom-color:var(--g-muted)}.lab-tabs button[aria-pressed=true]{border-bottom-color:var(--g-text);font-weight:var(--g-weight-control)}.lab-section{min-width:0}.skill-packs{list-style:none;padding:0;margin:0 0 var(--g-space-block);display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-gap:var(--g-space-content);gap:var(--g-space-content)}.skill-packs li{display:grid;align-content:start;grid-gap:var(--g-space-tight);gap:var(--g-space-tight);min-width:0}.skill-packs a{width:100%;justify-content:space-between}.skill-packs p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted);overflow-wrap:anywhere}.skill-group{display:grid;grid-gap:var(--g-space-tight);gap:var(--g-space-tight);margin-bottom:var(--g-space-group)}.skill-group h3{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);font-weight:var(--g-weight-body);color:var(--g-muted)}.skill-group ul{list-style:none;padding:0;margin:0;border-top:var(--g-border) solid var(--g-line)}.skill-group li{border-bottom:var(--g-border) solid var(--g-line)}.skill-group summary{display:grid;grid-template-columns:288px minmax(0,1fr) 16px;align-items:center;grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x);min-height:var(--g-control-height);padding-block:var(--g-space-compact);cursor:pointer;list-style:none;font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.skill-group summary::-webkit-details-marker{display:none}.skill-group summary code{font-weight:var(--g-weight-control)}.skill-group summary span{color:var(--g-muted)}.skill-facts{display:grid;grid-gap:var(--g-space-compact);gap:var(--g-space-compact);margin:0;padding-bottom:var(--g-space-card);font-size:var(--g-type-caption);line-height:var(--g-leading-caption)}.skill-facts>div{display:grid;grid-template-columns:minmax(160px,240px) minmax(0,1fr);grid-gap:var(--g-space-control-x);gap:var(--g-space-control-x)}.skill-facts dt{color:var(--g-muted)}.skill-facts dd{max-width:var(--g-text-measure);overflow-wrap:anywhere}.skill-text{padding-bottom:var(--g-space-card)}.skill-text>summary.action-control{display:inline-flex;grid-template-columns:none;width:max-content;min-height:var(--g-control-height);padding:0 var(--g-space-control-x);gap:var(--g-space-tight);list-style:none;font:var(--g-weight-body) var(--g-type-control)/var(--g-leading-control) var(--g-font-ui)}.skill-text>summary::-webkit-details-marker{display:none}.skill-text-hide,.skill-text[open]:not([data-state=closed])>summary .skill-text-show{display:none}.skill-text[open]:not([data-state=closed])>summary .skill-text-hide{display:inline}.skill-text>summary span{color:inherit;animation:popover-up var(--g-motion-m) var(--g-motion-ease)}.skill-text-sheet{margin-top:var(--g-space-control-x);width:100%;min-width:0;overflow:clip;border:var(--g-border) solid var(--g-line);border-radius:var(--g-radius);background:var(--g-surface)}.skill-text-sheet .code-toolbar{margin:0;padding:var(--g-space-compact) var(--g-space-control-x);border-bottom:var(--g-border) solid var(--g-line);flex-wrap:wrap}.skill-text-actions{display:flex;align-items:center;gap:var(--g-space-control-x)}.skill-text-sheet pre{margin:0;padding:var(--g-space-card);max-height:var(--g-skill-text-max-height);overflow:auto;overscroll-behavior:contain;font:var(--g-type-caption)/var(--g-leading-caption) var(--g-font-ui);white-space:pre-wrap;overflow-wrap:anywhere;-moz-tab-size:2;tab-size:2}.skill-text-sheet pre:focus-visible{outline:var(--g-focus) solid var(--g-text);outline-offset:-2px}.skill-text-status{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted);margin-top:var(--g-space-control-x)}.skill-text-status:empty,.source-code>[role=status]:empty{display:none}.lab-portrait-stage{position:relative;overflow:clip}.lab-portrait-stage canvas{position:absolute;inset:0;display:block;width:100%;height:100%}.lab-portrait-canvas{cursor:-webkit-grab;cursor:grab;touch-action:none}.lab-portrait-canvas:active{cursor:-webkit-grabbing;cursor:grabbing}.lab-portrait-canvas:focus-visible{outline-offset:-8px}.lab-portrait-poster{pointer-events:none}.lab-portrait-stage:not([data-portrait-state=webgl]) .lab-portrait-canvas,.lab-portrait-stage[data-portrait-state=webgl] .lab-portrait-poster{visibility:hidden}html[data-portfolio-theme=dark] .lab-portrait-stage canvas{filter:invert(1) brightness(.983)}.lab-portrait-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--g-space-control-x);margin-top:var(--g-space-control-x)}.lab-portrait-actions>div{display:flex;flex-wrap:wrap;gap:var(--g-space-tight)}.lab-portrait-actions p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.lab-portrait-icon{display:none}.work-steps{list-style:none;padding:0;margin:0;display:grid;grid-gap:var(--g-space-unit);gap:var(--g-space-unit);counter-reset:step}.work-steps li{display:grid;grid-template-columns:24px minmax(0,1fr);grid-gap:var(--g-space-unit) var(--g-space-tight);gap:var(--g-space-unit) var(--g-space-tight);padding:var(--g-space-compact);border-radius:var(--g-radius);counter-increment:step}.work-steps li:before{content:counter(step);grid-row:1/3;color:var(--g-muted);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.work-steps p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.work-steps li[data-current]{background:var(--g-surface)}.work-steps li[data-current]:before{color:var(--g-text)}.task-types{margin-top:var(--g-space-section)}.task-types ul{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-gap:0 var(--g-space-content);gap:0 var(--g-space-content)}.task-types li{grid-row:span 2;display:grid;grid-template-rows:subgrid;grid-row-gap:var(--g-space-unit);row-gap:var(--g-space-unit);padding-bottom:var(--g-space-control-x);border-top:var(--g-border) solid var(--g-line)}.task-types a{display:flex;justify-content:space-between;align-items:baseline;gap:var(--g-space-control-x);padding-block:var(--g-space-compact);text-decoration:none;font-weight:var(--g-weight-control)}.task-types a:hover{text-decoration:underline}.task-types p{font-size:var(--g-type-caption);line-height:var(--g-leading-caption);color:var(--g-muted)}.about-skills{margin-top:var(--g-space-section);display:grid;justify-items:start;grid-gap:var(--g-space-content);gap:var(--g-space-content)}.about-skills .section-heading{margin-bottom:0}.skill-chain{list-style:none;padding:0;margin:0;flex-wrap:wrap}.skill-chain,.skill-chain li{display:flex;align-items:center;gap:var(--g-space-tight)}.skill-chain li+li:before{content:"→";color:var(--g-muted)}.skill-chain a{display:inline-flex;align-items:center;min-height:var(--g-touch-target);padding-inline:var(--g-space-compact);background:var(--g-surface);border-radius:var(--g-radius);font-size:var(--g-type-caption);text-decoration:none}.skill-chain a:hover{text-decoration:underline}.collaboration{margin-top:var(--g-space-section)}.collaboration dl{margin-bottom:var(--g-space-card)}.collaboration dl>div{display:grid;grid-template-columns:240px minmax(0,1fr);grid-gap:var(--g-space-content);gap:var(--g-space-content);padding-block:var(--g-space-card);border-top:var(--g-border) solid var(--g-line)}.collaboration dt{font-weight:var(--g-weight-control)}.collaboration dd{max-width:var(--g-text-measure);color:var(--g-muted)}@media(max-width:1023px){.skill-packs{grid-template-columns:1fr}.component-previews,.task-types ul{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:720px){.lab-tabs{margin-bottom:var(--g-space-group)}.lab-portrait-canvas{touch-action:pan-y pinch-zoom}.skill-group summary{grid-template-columns:minmax(0,1fr) 16px;gap:var(--g-space-unit) var(--g-space-control-x)}.skill-group summary span{grid-row:2}.skill-facts>div{gap:var(--g-space-unit)}.collaboration dl>div,.skill-facts>div,.task-types ul{grid-template-columns:1fr}.collaboration dl>div{gap:var(--g-space-tight)}}@media(max-width:374px){html{--header-height:calc(var(--g-header-compact) + env(safe-area-inset-top,0px))}.site-header nav{display:grid;grid-template-columns:1fr 1fr;grid-column-gap:var(--g-space-control-x);column-gap:var(--g-space-control-x);overflow:visible}}.LogoIntro_intro__jlj5K{position:fixed;inset:0;z-index:var(--g-layer-intro);display:grid;place-items:center;background:var(--g-background);color:var(--g-text);pointer-events:none;animation:LogoIntro_leave__VBdHN var(--g-motion-logo-exit) calc(var(--g-motion-logo-draw) + var(--g-motion-logo-fill)) both}.LogoIntro_intro__jlj5K svg{width:var(--g-logo-size);height:var(--g-logo-size);overflow:visible}.LogoIntro_intro__jlj5K path{fill:currentColor;fill-opacity:0;stroke:currentColor;stroke-width:2;stroke-dasharray:1;stroke-dashoffset:1;animation:LogoIntro_draw__J_x5N var(--g-motion-logo-draw) var(--g-motion-logo-ease) both,LogoIntro_fill__ggGLH var(--g-motion-logo-fill) var(--g-motion-logo-draw) both}@keyframes LogoIntro_draw__J_x5N{to{stroke-dashoffset:0}}@keyframes LogoIntro_fill__ggGLH{to{fill-opacity:1}}@keyframes LogoIntro_leave__VBdHN{to{opacity:0;visibility:hidden}}@media(prefers-reduced-motion:reduce){.LogoIntro_intro__jlj5K{display:none;animation:none}.LogoIntro_intro__jlj5K path{animation:none}}