:root{color-scheme:dark;--bg: oklch(.18 .008 255);--bg-2: oklch(.225 .01 255);--surface: oklch(.215 .01 255);--surface-2: oklch(.255 .012 255);--ink: oklch(.94 .006 255);--muted: oklch(.72 .01 255);--quiet: oklch(.56 .012 255);--accent: oklch(1 0 0);--palette-blue-300: #93c5fd;--palette-blue-400: #60a5fa;--palette-blue-500: #3b82f6;--palette-blue-600: #2563eb;--palette-blue-700: #1d4ed8;--palette-blue-800: #1e40af;--palette-blue-900: #1e3a8a;--palette-violet-300: #c4b5fd;--palette-violet-400: #a78bfa;--palette-violet-500: #8b5cf6;--palette-violet-600: #7c3aed;--palette-violet-700: #6d28d9;--palette-violet-800: #5b21b6;--palette-violet-900: #4c1d95;--palette-amber-300: #fcd34d;--palette-amber-400: #fbbf24;--palette-amber-500: #f59e0b;--palette-amber-700: #b45309;--palette-amber-800: #92400e;--palette-amber-900: #78350f;--palette-emerald-300: #6ee7b7;--palette-emerald-400: #34d399;--palette-emerald-500: #10b981;--palette-emerald-600: #059669;--palette-emerald-700: #047857;--palette-emerald-800: #065f46;--palette-emerald-900: #064e3b;--tag-language: var(--palette-blue-400);--tag-framework: var(--palette-violet-400);--tag-type: var(--palette-amber-300);--tag-platform: var(--palette-emerald-300);--tag-language-csharp: var(--palette-blue-400);--tag-language-cpp: var(--palette-blue-600);--tag-language-rust: var(--palette-blue-300);--tag-language-typescript: var(--palette-blue-500);--tag-framework-unity: var(--palette-violet-400);--tag-framework-threejs: var(--palette-violet-300);--tag-framework-opengl: var(--palette-violet-500);--tag-framework-sdl2: var(--palette-violet-600);--tag-framework-sfml: var(--palette-violet-500);--tag-type-solo: var(--palette-amber-300);--tag-type-contract: var(--palette-amber-400);--tag-type-game-jam: var(--palette-amber-500);--tag-platform-steam: var(--palette-emerald-300);--tag-platform-itch: var(--palette-emerald-400);--tag-platform-xbox: var(--palette-emerald-500);--tag-platform-ps4: var(--palette-emerald-600);--tag-platform-github: var(--palette-emerald-500);--tag-platform-android: var(--palette-emerald-600);--max: 1200px;--page-gutter: 32px;--header: 68px;--section-scroll-offset: calc(var(--header) + 42px);--section-gap: clamp(5rem, 10vw, 9rem);--section-content-gap: clamp(1.75rem, 3vw, 2.5rem);--font-body: "Avenir Next", Avenir, "Segoe UI", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-display: "Avenir Next", Avenir, "Segoe UI", ui-sans-serif, system-ui, -apple-system, sans-serif;--ease: cubic-bezier(.16, 1, .3, 1);--ease-smooth: cubic-bezier(.25, .45, .5, 1)}:root[data-theme=light]{color-scheme:light;--bg: oklch(.965 .006 255);--bg-2: oklch(.925 .012 245);--surface: oklch(.985 .004 255);--surface-2: oklch(.94 .01 250);--ink: oklch(.18 .012 255);--muted: oklch(.39 .014 255);--quiet: oklch(.52 .012 255);--accent: oklch(0 0 0);--tag-language: var(--palette-blue-600);--tag-framework: var(--palette-violet-600);--tag-type: var(--palette-amber-700);--tag-platform: var(--palette-emerald-600);--tag-language-csharp: var(--palette-blue-700);--tag-language-cpp: var(--palette-blue-800);--tag-language-rust: var(--palette-blue-600);--tag-language-typescript: var(--palette-blue-900);--tag-framework-unity: var(--palette-violet-700);--tag-framework-threejs: var(--palette-violet-600);--tag-framework-opengl: var(--palette-violet-800);--tag-framework-sdl2: var(--palette-violet-900);--tag-framework-sfml: var(--palette-violet-800);--tag-type-solo: var(--palette-amber-700);--tag-type-contract: var(--palette-amber-800);--tag-type-game-jam: var(--palette-amber-900);--tag-platform-steam: var(--palette-emerald-600);--tag-platform-itch: var(--palette-emerald-700);--tag-platform-xbox: var(--palette-emerald-800);--tag-platform-ps4: var(--palette-emerald-900);--tag-platform-github: var(--palette-emerald-800);--tag-platform-android: var(--palette-emerald-900)}*{box-sizing:border-box}.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}html{min-height:100%;overflow-x:clip;scroll-padding-top:var(--section-scroll-offset);scroll-behavior:smooth}body{min-width:320px;min-height:100%;margin:0;background:linear-gradient(145deg,transparent 0 46%,color-mix(in oklch,var(--accent) 6%,transparent) 100%),linear-gradient(180deg,var(--bg-2) 0,var(--bg) 34rem,var(--bg) 100%);color:var(--ink);font-family:var(--font-body);line-height:1.62;overflow-x:clip}html.project-modal-open{overflow:hidden;overscroll-behavior:none}body.project-modal-open{position:fixed;top:var(--page-scroll-lock-offset, 0);left:0;width:100%;overflow:hidden;overscroll-behavior:none}a{color:inherit;text-decoration:none}button{font:inherit}:where(a,button):focus-visible{outline:2px solid var(--accent);outline-offset:3px}.skip-link{position:fixed;top:12px;left:12px;z-index:120;display:inline-flex;min-height:44px;align-items:center;border-radius:999px;background:var(--ink);color:var(--bg);font-weight:800;padding:0 1rem;transform:translateY(calc(-100% - 20px));transition:transform .16s var(--ease)}.skip-link:focus{transform:translateY(0)}.home-page:focus{outline:none}img{display:block;max-width:100%}::selection{background:var(--accent);color:var(--bg)}.site-header{position:sticky;top:18px;z-index:50;display:flex;width:min(var(--max),calc(100% - var(--page-gutter)));min-height:var(--header);align-items:center;justify-content:space-between;gap:18px;margin:0 auto;border:1px solid color-mix(in oklch,var(--ink) 14%,transparent);border-radius:999px;background:color-mix(in oklch,var(--surface) 88%,transparent);padding:8px 12px 8px 16px;backdrop-filter:blur(16px) saturate(120%);-webkit-backdrop-filter:blur(16px) saturate(120%)}.brand{display:inline-flex;min-width:0;align-items:center}.brand-type{display:grid;gap:2px;min-width:0}.brand strong,.brand small{display:block;overflow:hidden;letter-spacing:0;line-height:1.08;text-overflow:ellipsis;white-space:nowrap}.brand strong{color:var(--ink);font-size:clamp(.94rem,2vw,1.08rem);font-weight:760}.brand small{color:var(--muted);font-size:clamp(.68rem,1.6vw,.74rem);font-weight:760}.header-controls{display:flex;flex:0 0 auto;align-items:center;gap:8px}.theme-toggle-button{--theme-toggle-thumb-x: calc(100% + 2px) ;position:relative;display:inline-grid;width:78px;height:44px;grid-template-columns:repeat(2,1fr);grid-template-rows:1fr;align-items:stretch;border:1px solid color-mix(in oklch,var(--ink) 13%,transparent);border-radius:999px;background:color-mix(in oklch,var(--surface) 92%,transparent);color:var(--muted);cursor:pointer;isolation:isolate;padding:4px;-webkit-tap-highlight-color:transparent;touch-action:manipulation;transition:border-color .18s var(--ease),background .18s var(--ease)}.theme-toggle-button:before{position:relative;z-index:0;width:32px;height:32px;place-self:center;border-radius:50%;background:var(--ink);content:"";grid-column:1;grid-row:1;transform:translate(var(--theme-toggle-thumb-x));transform-origin:center;transition:transform .24s var(--ease)}:root[data-theme=light] .theme-toggle-button{--theme-toggle-thumb-x: 0%}.theme-toggle-button:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.theme-toggle-icon{position:relative;z-index:1;display:grid;min-width:0;height:100%;place-items:center;color:var(--muted);line-height:0;opacity:.78;transition:color .18s var(--ease),opacity .18s var(--ease)}.theme-toggle-sun{grid-column:1;grid-row:1}.theme-toggle-moon{grid-column:2;grid-row:1}.theme-toggle-icon svg{display:block;width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}:root[data-theme=light] .theme-toggle-sun,:root:not([data-theme=light]) .theme-toggle-moon{color:var(--bg);opacity:1}@media(hover:hover)and (pointer:fine){.theme-toggle-button:hover{border-color:color-mix(in oklch,var(--ink) 26%,transparent);background:color-mix(in oklch,var(--surface-2) 84%,transparent)}}.page-section{display:grid;width:min(var(--max),calc(100% - var(--page-gutter)));gap:var(--section-content-gap);margin-inline:auto;scroll-margin-top:var(--section-scroll-offset)}.four-section-page{display:grid;gap:var(--section-gap);padding-block:clamp(4rem,8vw,7rem) clamp(8rem,13vw,11rem)}.section-label{display:inline-flex;width:fit-content;margin:0;color:var(--accent);font-family:var(--font-display);font-size:clamp(2.25rem,6vw,5rem);font-weight:900;letter-spacing:0;line-height:.95;text-wrap:balance}h1,h2,h3,h4,p{text-wrap:pretty}.about-section{align-items:start;column-gap:clamp(3rem,6vw,6rem);grid-template-columns:minmax(0,1fr) minmax(18rem,22rem)}.about-section .section-label,.about-prose{grid-column:1}.about-prose,.contact-copy{display:grid;width:100%;max-width:72ch}.about-prose{grid-row:2;gap:1rem}.about-portrait{position:relative;grid-column:2;grid-row:2;width:auto;max-width:none;height:100%;aspect-ratio:900 / 870;align-self:stretch;justify-self:end;overflow:hidden;margin:0;background:color-mix(in oklch,var(--surface-2) 72%,var(--bg));contain:size;isolation:isolate}.about-portrait img{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;max-width:none;height:100%;border-radius:6px;object-fit:contain;outline:1px solid color-mix(in oklch,var(--ink) 11%,transparent);outline-offset:-1px}.about-prose p,.contact-copy p{margin:0;color:var(--muted);font-size:clamp(1rem,1.35vw,1.14rem);line-height:1.75}.resume-board{display:grid;overflow:hidden;border:1px solid color-mix(in oklch,var(--ink) 14%,transparent);border-radius:10px;background:linear-gradient(135deg,color-mix(in oklch,var(--surface-2) 30%,transparent),transparent 46%),color-mix(in oklch,var(--surface) 94%,transparent);grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.resume-pane{display:grid;min-width:0;align-content:start;gap:clamp(1rem,2.2vw,1.45rem);padding:clamp(1rem,2.8vw,2rem)}.resume-pane-work{grid-column:1;grid-row:1;border-bottom:1px solid color-mix(in oklch,var(--ink) 12%,transparent)}.resume-pane-education{grid-column:2;grid-row:1;border-bottom:1px solid color-mix(in oklch,var(--ink) 12%,transparent);border-left:1px solid color-mix(in oklch,var(--ink) 12%,transparent)}.resume-pane-skills{grid-column:1 / -1;grid-row:2}.resume-side-stack{display:contents;min-width:0}.resume-side-stack .resume-pane+.resume-pane{border-left:1px solid color-mix(in oklch,var(--ink) 12%,transparent)}.resume-side-stack .resume-pane-skills{border-left:0}.resume-pane-head{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem}.resume-pane-head h3{margin:0;color:var(--ink);font-family:var(--font-display);font-size:clamp(1.55rem,3vw,2.5rem);font-weight:900;letter-spacing:0;line-height:.98;text-wrap:balance}.cv-timeline{display:grid;border-top:1px solid color-mix(in oklch,var(--ink) 14%,transparent)}.cv-timeline article{position:relative;display:grid;gap:clamp(.85rem,2vw,1.35rem);grid-template-columns:minmax(9.25rem,.22fr) minmax(0,1fr);padding:clamp(.95rem,2.1vw,1.2rem) 0}.cv-timeline article+article{border-top:1px solid color-mix(in oklch,var(--ink) 10%,transparent)}.cv-timeline article:last-child{padding-bottom:0}.cv-date{display:inline-flex;width:fit-content;max-width:100%;align-items:baseline;color:var(--quiet);font-size:.76rem;font-weight:900;gap:.42rem;line-height:1.08;white-space:nowrap}.cv-date-start,.cv-date-end{display:inline;color:inherit}.cv-date-end{width:auto;margin-top:0;border-top:0;padding-top:0}.cv-date-end:before{color:inherit;content:"-";margin-right:.42rem}.cv-entry-copy{min-width:0}.cv-timeline h4{margin:0;color:var(--ink);font-size:clamp(1rem,1.35vw,1.14rem);line-height:1.18}.cv-timeline p{margin:.25rem 0 0;color:var(--muted);line-height:1.5}.cv-timeline-compact article{grid-template-columns:minmax(6.9rem,.28fr) minmax(0,1fr)}.cv-timeline-compact h4{font-size:clamp(.94rem,1.25vw,1.04rem)}.cv-timeline-compact p{font-size:.9rem}.resume-pane-work .cv-timeline h4{font-size:clamp(.94rem,1.25vw,1.04rem)}.resume-pane-work .cv-timeline p{font-size:.9rem}.cv-skill-list{display:grid;align-items:start;border-top:1px solid color-mix(in oklch,var(--ink) 14%,transparent);grid-template-columns:minmax(0,1fr) minmax(0,.82fr)}.cv-skill-list article{display:grid;min-width:0;gap:.75rem;padding:.95rem clamp(1rem,2.2vw,1.6rem) .95rem 0}.cv-skill-list article+article{border-left:1px solid color-mix(in oklch,var(--ink) 10%,transparent);padding-right:0;padding-left:clamp(1rem,2.2vw,1.6rem)}.cv-skill-list article:first-child{padding-top:1rem}.cv-skill-list article:last-child{padding-bottom:0}.cv-skill-list h4{margin:0;color:var(--ink);font-size:clamp(.98rem,1.35vw,1.08rem);line-height:1.18}.cv-skill-list ul{display:grid;gap:.78rem;margin:0;padding:0;list-style:none}.cv-skill-list li{display:grid;gap:.42rem;color:var(--muted);font-size:.92rem;line-height:1.48}.cv-skill-row-head{display:flex;min-width:0;align-items:baseline;justify-content:space-between;gap:.8rem}.cv-skill-row-head strong{min-width:0;color:var(--ink);font-size:.94rem;font-weight:760;line-height:1.2}.cv-skill-row-head small{flex:0 0 auto;color:var(--muted);font-size:.76rem;font-weight:780;line-height:1.2;text-align:right}.cv-skill-meter{display:block;height:5px;overflow:hidden;border-radius:999px;background:color-mix(in oklch,var(--ink) 10%,transparent)}.cv-skill-meter span{display:block;width:var(--skill-value);height:100%;border-radius:inherit;background:var(--accent)}.cv-skill-programming .cv-skill-meter{height:7px}.cv-skill-programming li{align-items:center;column-gap:clamp(.75rem,2vw,1rem);grid-template-columns:minmax(5.6rem,.3fr) minmax(0,1fr)}.cv-skill-programming .cv-skill-row-head{display:block}.cv-skill-programming .cv-skill-row-head strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cv-skill-language li{grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:1rem}.cv-skill-language .cv-skill-row-head{display:grid;gap:.18rem;justify-content:stretch}.cv-skill-language .cv-skill-row-head small{text-align:left}.cv-language-scale{display:grid;align-items:center;grid-template-columns:repeat(5,12px);gap:6px}.cv-language-scale span{display:block;width:12px;height:12px;border:1px solid color-mix(in oklch,var(--ink) 12%,transparent);border-radius:3px;background:color-mix(in oklch,var(--ink) 8%,transparent)}.cv-language-scale span.active{border-color:color-mix(in oklch,var(--accent) 78%,var(--ink) 8%);background:var(--accent)}.project-tile-grid{display:grid;align-items:start;gap:clamp(1rem,2vw,1.35rem);grid-template-columns:repeat(3,minmax(0,1fr))}.project-tile{position:relative;display:grid;width:100%;container-type:inline-size;grid-template-rows:auto auto;overflow:hidden;border:1px solid color-mix(in oklch,var(--ink) 12%,transparent);border-radius:14px;background:linear-gradient(145deg,color-mix(in oklch,var(--surface-2) 74%,transparent),color-mix(in oklch,var(--surface) 96%,transparent));color:var(--ink);cursor:pointer;isolation:isolate;padding:clamp(.42rem,.8vw,.55rem);scale:1;text-align:left;transform-origin:center;transition:transform .3s var(--ease),scale .32s var(--ease-smooth),border-color .22s var(--ease),background .22s var(--ease)}.project-tile:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:radial-gradient(circle at 28% 12%,color-mix(in oklch,var(--ink) 12%,transparent),transparent 32%),linear-gradient(135deg,color-mix(in oklch,var(--ink) 5%,transparent),transparent 54%);content:"";opacity:0;transition:opacity .26s var(--ease-smooth)}.project-tile-media{position:relative;display:block;width:100%;aspect-ratio:16 / 9;overflow:hidden;border:1px solid color-mix(in oklch,var(--ink) 10%,transparent);border-radius:10px;background:color-mix(in oklch,var(--bg) 70%,black)}.project-tile-media>img,.project-tile-media>video{position:absolute;top:0;right:0;bottom:0;left:0;display:block;width:100%;height:100%;object-fit:cover;opacity:.88;transition:opacity .22s var(--ease)}.project-tile-media .project-tile-preview{z-index:1;opacity:0;pointer-events:none}.project-tile-media .project-tile-preview.active,.project-tile-media img.project-tile-preview{opacity:1}.project-tile-content{display:grid;min-height:0;align-content:start;gap:.5rem;padding:clamp(.58rem,1vw,.72rem) .18rem .16rem}.project-tile-head{display:flex;min-width:0;align-items:center;justify-content:space-between;gap:.5rem}.project-tile-head strong{min-width:0;color:var(--ink);font-family:var(--font-display);font-size:clamp(.96rem,5.6cqi,1.55rem);font-weight:900;letter-spacing:-.01em;line-height:1;white-space:nowrap}.project-tile-year{flex:0 0 auto;color:var(--quiet);font-size:clamp(.76rem,3.8cqi,.9rem);font-variant-numeric:tabular-nums;font-weight:800;letter-spacing:.015em;line-height:1;text-align:right}.project-tile-tags{display:flex;min-width:0;flex-wrap:nowrap;align-items:baseline;gap:.55rem}.project-tile-summary{display:flex;min-width:0;align-items:baseline;justify-content:space-between;gap:.75rem}.project-tile-meta{display:flex;flex:0 0 auto;align-items:baseline;gap:.6rem;white-space:nowrap}.project-tag{--project-tag-tone: var(--muted);display:inline-flex;align-items:baseline;border:0;background:transparent;color:var(--project-tag-tone);font-size:.72rem;font-weight:800;letter-spacing:0;line-height:1.15;padding:0;white-space:nowrap}.project-tag-cluster{display:inline-flex;flex:0 0 auto;align-items:baseline;gap:.28rem;border:0;background:transparent}.project-tag-language{--project-tag-tone: var(--tag-language)}.project-tag-framework{--project-tag-tone: var(--tag-framework)}.project-tag-type{--project-tag-tone: var(--tag-type)}.project-tag-platform{--project-tag-tone: var(--tag-platform)}.project-tag-language[data-tag="C#"]{--project-tag-tone: var(--tag-language-csharp)}.project-tag-language[data-tag="C++"]{--project-tag-tone: var(--tag-language-cpp)}.project-tag-language[data-tag=Rust]{--project-tag-tone: var(--tag-language-rust)}.project-tag-language[data-tag=TypeScript]{--project-tag-tone: var(--tag-language-typescript)}.project-tag-framework[data-tag=Unity]{--project-tag-tone: var(--tag-framework-unity)}.project-tag-framework[data-tag="Three.js"]{--project-tag-tone: var(--tag-framework-threejs)}.project-tag-framework[data-tag=OpenGL]{--project-tag-tone: var(--tag-framework-opengl)}.project-tag-framework[data-tag=SDL2]{--project-tag-tone: var(--tag-framework-sdl2)}.project-tag-framework[data-tag=SFML]{--project-tag-tone: var(--tag-framework-sfml)}.project-tag-type[data-tag=Solo]{--project-tag-tone: var(--tag-type-solo)}.project-tag-type[data-tag=Contract]{--project-tag-tone: var(--tag-type-contract)}.project-tag-type[data-tag="Game Jam"]{--project-tag-tone: var(--tag-type-game-jam)}.project-tag-platform[data-tag=Steam],.project-tag-platform[data-tag=PC],.project-tag-platform[data-tag=Web]{--project-tag-tone: var(--tag-platform-steam)}.project-tag-platform[data-tag="Itch.io"]{--project-tag-tone: var(--tag-platform-itch)}.project-tag-platform[data-tag="Xbox One"]{--project-tag-tone: var(--tag-platform-xbox)}.project-tag-platform[data-tag=GitHub]{--project-tag-tone: var(--tag-platform-github)}.project-tag-platform[data-tag=PS4]{--project-tag-tone: var(--tag-platform-ps4)}.project-tag-platform[data-tag=Android]{--project-tag-tone: var(--tag-platform-android)}.project-tile{transition:opacity .52s var(--ease),transform .52s var(--ease),scale .32s var(--ease-smooth),border-color .22s var(--ease),background .22s var(--ease)}.project-tile:hover,.project-tile:focus-visible{z-index:2;border-color:color-mix(in oklch,var(--accent) 42%,var(--ink) 12%);scale:1.018}.project-tile:active{scale:1.008}.project-tile:hover:before,.project-tile:focus-visible:before{opacity:1}.project-tile:hover .project-tile-media img,.project-tile:focus-visible .project-tile-media img{opacity:1}.project-tile:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.project-tile-origin-hidden{pointer-events:none;scale:1!important;transform:none!important;transition:none!important;visibility:hidden}.legacy-project-links{display:flex;flex-wrap:wrap;gap:.75rem}.legacy-project-links a,.button,.button-primary{display:inline-flex;min-height:44px;align-items:center;width:fit-content;border:1px solid color-mix(in oklch,var(--ink) 14%,transparent);border-radius:999px;background:color-mix(in oklch,var(--ink) 8%,transparent);color:var(--ink);font-weight:780;gap:.45rem;justify-content:center;padding:0 1rem;transition:background-color .16s var(--ease-smooth),border-color .16s var(--ease-smooth),transform .16s var(--ease-smooth)}.legacy-project-links a:hover,.legacy-project-links a:focus-visible,.button:hover,.button:focus-visible{border-color:color-mix(in oklch,var(--ink) 30%,transparent);background:color-mix(in oklch,var(--ink) 13%,transparent);transform:translateY(-1px)}.legacy-project-links a:active,.button:active{transform:translateY(0)}.legacy-project-links svg{width:16px;height:16px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.8}.button-primary{background:var(--ink);color:var(--bg)}.button-primary:hover,.button-primary:focus-visible{background:color-mix(in oklch,var(--ink) 88%,var(--bg))}.project-modal-backdrop{--project-modal-duration: .52s;--project-modal-ease: cubic-bezier(.65, 0, .35, 1);position:fixed;top:0;right:0;bottom:0;left:0;z-index:80}.project-modal-backdrop.closing{--project-modal-duration: .42s}.project-modal-backdrop:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background:radial-gradient(circle at 50% 16%,color-mix(in oklch,var(--accent) 5%,transparent),transparent 34rem),color-mix(in oklch,var(--bg) 84%,transparent);content:"";opacity:0;pointer-events:none}.project-modal-backdrop.opening:before{animation:project-backdrop-in .22s var(--ease-smooth) both}.project-modal-backdrop.closing:before{animation:project-backdrop-out var(--project-modal-duration) var(--project-modal-ease) both}.project-modal-scrim{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;border:0;background:transparent;cursor:default}.project-modal{--project-modal-final-radius: 18px;--project-modal-left: 24px;--project-modal-top: 24px;--project-modal-width: calc(100vw - 48px) ;--project-modal-height: calc(100dvh - 48px) ;--project-modal-origin-x: 0px;--project-modal-origin-y: 0px;--project-modal-origin-scale-x: .25;--project-modal-origin-scale-y: .4;--project-modal-front-width: 320px;--project-modal-front-height: 320px;--project-modal-front-scale-x: 4;--project-modal-front-scale-y: 2.5;--project-modal-origin-radius: 14px;position:fixed;z-index:2;top:var(--project-modal-top);left:var(--project-modal-left);width:var(--project-modal-width);height:var(--project-modal-height);contain:layout style;border-radius:var(--project-modal-final-radius);outline:none;perspective:1800px;transform-style:preserve-3d}.project-flip-card{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;transform:translate3d(var(--project-modal-origin-x),var(--project-modal-origin-y),0) scale(var(--project-modal-origin-scale-x),var(--project-modal-origin-scale-y)) rotateY(0);transform-origin:center;transform-style:preserve-3d;will-change:transform}.project-modal-face{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;border:1px solid color-mix(in oklch,var(--ink) 14%,transparent);border-radius:inherit;background:var(--surface);backface-visibility:hidden;contain:layout paint;isolation:isolate;-webkit-backface-visibility:hidden}.project-flip-card.settled .project-modal-face-front{visibility:hidden}.project-modal-face-front{border:0;background:transparent;transform:rotateY(0)}.project-modal-face-back{display:grid;align-content:center;grid-template-columns:minmax(0,1.55fr) minmax(24rem,.85fr);grid-template-rows:auto auto;background:radial-gradient(circle at 82% 46%,color-mix(in oklch,var(--surface-2) 66%,transparent),transparent 34rem),var(--surface);transform:rotateY(180deg)}.project-modal-backdrop.opening .project-flip-card{animation:project-card-open var(--project-modal-duration) var(--project-modal-ease) both}.project-modal-backdrop.closing .project-flip-card{animation:project-card-open var(--project-modal-duration) var(--project-modal-ease) reverse both}.project-modal-backdrop.opening .project-flip-card.settled{animation:none;transform:translateZ(0) scale(1) rotateY(180deg);will-change:auto}.project-modal-front-replica{position:absolute;top:0;right:0;bottom:0;left:0;container-type:inline-size;display:grid;width:var(--project-modal-front-width);height:var(--project-modal-front-height);grid-template-rows:auto auto;overflow:hidden;border:1px solid color-mix(in oklch,var(--ink) 10%,transparent);border-radius:var(--project-modal-origin-radius);background:linear-gradient(145deg,var(--surface-2),var(--surface));color:var(--ink);isolation:isolate;padding:clamp(.42rem,.8vw,.55rem);transform:scale(var(--project-modal-front-scale-x),var(--project-modal-front-scale-y));transform-origin:top left}.project-modal-front-replica:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:radial-gradient(circle at 28% 12%,color-mix(in oklch,var(--ink) 12%,transparent),transparent 32%),linear-gradient(135deg,color-mix(in oklch,var(--ink) 5%,transparent),transparent 54%);content:""}.project-modal-front-replica .project-tile-media img{opacity:1;transform:scale(1.04);transition:none}.project-modal-header{position:static;z-index:3;display:flex;min-width:0;align-self:end;align-items:flex-start;justify-content:space-between;gap:clamp(1rem,3vw,3rem);grid-column:2;grid-row:1;padding:0 5.5rem .5rem 2rem}.project-modal-header h2{min-width:0;margin:0;color:var(--ink);font-family:var(--font-display);font-size:clamp(2.1rem,2.8vw,3.25rem);line-height:.94;text-wrap:balance}.project-modal-close{position:absolute;top:clamp(1rem,1.8vw,1.5rem);right:clamp(1rem,1.8vw,1.5rem);z-index:4;display:grid;flex:0 0 auto;width:44px;min-width:44px;height:44px;min-height:44px;place-items:center;border:0;border-radius:50%;background:transparent;color:var(--muted);cursor:pointer;padding:0;transition:color .16s var(--ease-smooth),transform .16s var(--ease-smooth)}.project-modal-close:before{position:absolute;top:5px;right:5px;bottom:5px;left:5px;border:1px solid color-mix(in oklch,var(--ink) 14%,transparent);border-radius:inherit;background:color-mix(in oklch,var(--ink) 5%,transparent);content:"";transition:transform .16s var(--ease-smooth),border-color .16s var(--ease-smooth),background .16s var(--ease-smooth)}.project-modal-close svg{position:relative;z-index:1;width:15px;height:15px;fill:none;pointer-events:none;stroke:currentColor;stroke-linecap:round;stroke-width:2.1}.project-modal-close:hover,.project-modal-close:focus-visible{color:var(--ink)}.project-modal-close:hover:before,.project-modal-close:focus-visible:before{border-color:color-mix(in oklch,var(--ink) 24%,transparent);background:color-mix(in oklch,var(--ink) 10%,transparent);transform:scale(1.04)}.project-modal-close:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.project-modal-close:active:before{transform:scale(.94)}.project-modal-body{display:contents;min-height:0}.project-modal-media{display:grid;min-height:0;align-items:center;justify-items:center;overflow:hidden;grid-column:1;grid-row:1 / -1;padding:1.5rem}.project-modal-video,.project-modal-media>img{position:relative;width:100%;max-width:100%;border:1px solid color-mix(in oklch,var(--ink) 14%,transparent);border-radius:14px;background:#050505;box-shadow:0 20px 55px color-mix(in oklch,black 16%,transparent)}.project-modal-video{aspect-ratio:var(--project-video-aspect-ratio, 16 / 9);overflow:hidden}.project-modal-video-poster{display:block;width:100%;height:100%;object-fit:cover}.project-modal-media>img{aspect-ratio:16 / 9;object-fit:cover}.project-modal-copy{display:grid;min-height:0;align-content:start;gap:1.25rem;grid-column:2;grid-row:2;overflow-y:auto;overscroll-behavior:contain;padding:.5rem 2rem 0;scroll-padding-block:1rem 2rem;scrollbar-color:color-mix(in oklch,var(--ink) 24%,transparent) transparent;scrollbar-width:thin}.project-modal-copy p{max-width:58ch;margin:0;color:var(--muted);font-size:clamp(1rem,1.2vw,1.08rem);line-height:1.72}.project-modal-description{text-wrap:pretty}.project-copy-tag{color:var(--project-tag-tone);font-weight:800}.project-modal-copy .legacy-project-links{margin-top:.3rem}@keyframes project-backdrop-in{0%{opacity:0}to{opacity:1}}@keyframes project-backdrop-out{0%,58%{opacity:1}to{opacity:0}}@keyframes project-card-open{0%{transform:translate3d(var(--project-modal-origin-x),var(--project-modal-origin-y),0) scale(var(--project-modal-origin-scale-x),var(--project-modal-origin-scale-y)) rotateY(0)}to{transform:translateZ(0) scale(1) rotateY(180deg)}}.contact-copy{gap:1.3rem;justify-items:start}.contact-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:.75rem;max-width:100%}.contact-actions .button-primary{min-height:48px;max-width:100%;border-color:var(--accent);background:var(--accent);color:var(--bg);justify-content:center;padding-inline:1.15rem;overflow-wrap:anywhere;text-align:center;white-space:normal}.contact-actions .button-primary:hover,.contact-actions .button-primary:focus-visible{background:color-mix(in oklch,var(--ink) 88%,var(--bg))}.contact-actions .button-primary svg{width:18px;height:18px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.8}.site-dock{position:fixed;top:auto;right:auto;bottom:22px;left:50%;z-index:50;display:block;width:auto;min-height:0;border:1px solid color-mix(in oklch,var(--ink) 14%,transparent);border-radius:999px;background:color-mix(in oklch,var(--surface) 88%,transparent);padding:8px;transform:translate(-50%);backdrop-filter:blur(16px) saturate(120%);-webkit-backdrop-filter:blur(16px) saturate(120%)}.mobile-dock-toggle{display:none}.dock-track{display:flex;gap:8px;align-items:center}.site-dock a{display:inline-flex;min-width:0;height:42px;align-items:center;justify-content:center;border-radius:999px;color:var(--muted);font-size:.9rem;font-weight:820;letter-spacing:0;padding:0 18px;transition:background-color .18s ease,color .18s ease}.site-dock a.active{background:var(--ink);color:var(--bg)}@media(max-width:950px){.project-tile-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:900px){.about-section{column-gap:clamp(1.75rem,4vw,2.75rem);grid-template-columns:minmax(0,1fr) minmax(18rem,22rem)}.about-portrait{width:100%;max-width:22rem;height:auto;align-self:center}.project-modal-face-back{display:grid;align-content:stretch;background:var(--surface);grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr)}.project-modal-header{align-self:auto;border-bottom:1px solid color-mix(in oklch,var(--ink) 10%,transparent);background:var(--surface);grid-column:1;grid-row:1;padding:clamp(1.15rem,2.2vw,1.8rem) clamp(1.15rem,2.8vw,2.5rem)}.project-modal-close{position:relative;top:auto;right:auto}.resume-board{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.resume-pane-work{grid-column:1;grid-row:1;border-right:0;border-bottom:1px solid color-mix(in oklch,var(--ink) 12%,transparent)}.resume-pane-education{grid-column:2;grid-row:1;border-bottom:1px solid color-mix(in oklch,var(--ink) 12%,transparent);border-left:1px solid color-mix(in oklch,var(--ink) 12%,transparent)}.resume-pane-skills{grid-column:1 / -1;grid-row:2}.resume-side-stack{display:contents}.resume-side-stack .resume-pane+.resume-pane{border-top:0;border-left:0}.project-modal-body{display:block;grid-column:1;grid-row:2;overflow-y:auto;overscroll-behavior:contain;scrollbar-color:color-mix(in oklch,var(--ink) 24%,transparent) transparent;scrollbar-width:thin}.project-modal-media{min-height:0;overflow:visible;border-right:0;border-bottom:1px solid color-mix(in oklch,var(--ink) 9%,transparent)}.project-modal-media.has-video{background:transparent;padding:0}.project-modal-media.has-video .project-modal-video{border:0;border-radius:0;box-shadow:none}.project-modal-copy{align-content:start;overflow:visible;padding:clamp(1.25rem,5vw,2.25rem)}}@media(max-width:620px){:root{--page-gutter: 24px;--header: 62px;--section-gap: 4.5rem;--section-content-gap: 1.5rem}.site-header{top:max(10px,env(safe-area-inset-top));gap:8px;padding:8px 8px 8px 14px}.brand{flex:1 1 auto}.brand strong{max-width:168px;font-size:.9rem}.brand small{font-size:.66rem}.header-controls{flex:0 0 auto;gap:5px}.four-section-page{padding-block:2.25rem 8rem}.section-label{font-size:clamp(2rem,13vw,3.2rem)}.about-prose p,.contact-copy p{font-size:.98rem;line-height:1.68}.resume-board{border-radius:8px;grid-template-columns:1fr}.resume-pane{gap:1rem;padding:1rem}.resume-pane-work,.resume-pane-education,.resume-pane-skills{grid-column:auto;grid-row:auto}.resume-pane-education{border-bottom:0;border-left:0}.resume-side-stack{display:grid;grid-template-columns:1fr}.resume-side-stack .resume-pane+.resume-pane{border-top:1px solid color-mix(in oklch,var(--ink) 12%,transparent);border-left:0}.resume-pane-head h3{font-size:1.35rem}.cv-timeline article{gap:.45rem;grid-template-columns:1fr;padding:1rem 0}.cv-skill-list li{font-size:.9rem}.cv-skill-list{grid-template-columns:1fr}.cv-skill-list article{padding-right:0}.cv-skill-list article+article{border-top:1px solid color-mix(in oklch,var(--ink) 10%,transparent);border-left:0;padding-left:0}.cv-date{font-size:.8rem}.cv-skill-row-head{align-items:flex-start}.cv-skill-language li{grid-template-columns:1fr;row-gap:.55rem}.project-tile-grid{grid-template-columns:1fr}.project-modal-header{align-items:flex-start;gap:.75rem;padding:1rem}.project-modal-header.single-line-title{align-items:center;padding-block:.75rem}.project-modal-header h2{font-size:clamp(1.7rem,8vw,2.8rem)}.project-modal-copy{gap:.9rem;padding:1.25rem 1rem 1.5rem}.site-dock{display:grid;bottom:max(8px,env(safe-area-inset-bottom));width:min(50vw,280px);max-width:calc(100% - var(--page-gutter));border-radius:29px;gap:0;padding:6px}.mobile-dock-toggle{display:flex;grid-area:1 / 1;width:100%;min-width:0;height:44px;align-items:center;justify-content:center;border:0;border-radius:999px;background:var(--ink);color:var(--bg);cursor:pointer;font-weight:820;padding:0 18px}.site-dock.mobile-open .mobile-dock-toggle{display:none}.dock-track{display:grid;visibility:hidden;grid-area:1 / 1;grid-template-columns:minmax(0,1fr);width:100%;gap:0;max-height:0;overflow:hidden;opacity:0;padding:0;transition:max-height .22s var(--ease),gap .22s var(--ease),opacity .16s ease}.site-dock.mobile-open .dock-track{visibility:visible;max-height:200px;gap:8px;opacity:1}.site-dock a{width:100%;min-width:0;height:44px;border-radius:999px;white-space:nowrap}.site-dock.mobile-open a{transition:height .22s var(--ease),opacity .16s ease,transform .22s var(--ease),background-color .18s ease,color .18s ease}.contact-actions{width:100%;align-items:stretch;flex-direction:column}.contact-actions .button-primary{width:fit-content;align-self:flex-start;justify-content:center}}@media(max-width:700px){.about-section{grid-template-columns:minmax(0,1fr)}.about-section .section-label{grid-column:1;grid-row:1}.about-prose{display:contents;grid-column:1}.about-prose p{grid-column:1}.about-prose p:nth-child(1){grid-row:2}.about-prose p:nth-child(2){grid-row:4}.about-prose p:nth-child(3){grid-row:5}.about-portrait{grid-column:1;grid-row:3;width:min(70vw,14rem);max-width:none;height:auto;aspect-ratio:900 / 870;contain:none;justify-self:center}}@media(hover:none)and (pointer:coarse){.project-tile,.project-tile img{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.project-tile{touch-action:pan-y pinch-zoom}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.001ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.001ms!important}}
