.github-panel{--activity-color:var(--season-accent,#426950);border:1px solid var(--line);background:var(--bg);border-radius:10px;padding:1.5rem}:root[data-theme=dark] .github-panel{--activity-color:var(--season-accent,#8abf9b)}.github-profile,.github-profile>div{justify-content:space-between;align-items:center;gap:.65rem;display:flex}.github-profile{border-bottom:1px solid var(--line);padding-bottom:.8rem;font-family:Geist Mono,monospace;font-size:.75rem}.github-stats{grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin:1.5rem 0 2rem;display:grid}.github-stats>div{flex-direction:column-reverse;justify-content:end;gap:.5rem;display:flex}.github-stats dt{color:var(--muted);max-width:21ch;font-size:.68rem}.github-stats dd{margin:0;font-family:Geist Pixel,monospace;font-size:clamp(1.3rem,2.2vw,1.8rem)}.github-calendar-header{justify-content:space-between;align-items:baseline;gap:1rem;margin-bottom:.8rem;display:flex}.github-panel h3{font-size:.85rem}.github-calendar-header>span,.github-calendar-footer,.github-chart-dates,.github-source{color:var(--muted);font-family:Geist Mono,monospace;font-size:.6rem}.github-calendar-scroll{padding-bottom:.6rem;overflow-x:auto}.github-calendar{gap:3px;min-width:620px;display:flex}.github-week{flex:1;grid-template-rows:20px repeat(7,10px);gap:3px;min-width:8px;display:grid}.github-month{color:var(--muted);white-space:nowrap;font:.55rem Geist Mono,monospace}.github-day{background:var(--fill);border-radius:2px;min-width:8px;height:10px;display:inline-block}.github-day:not([data-level]){visibility:hidden}.github-day[data-level="1"]{background:color-mix(in srgb,var(--activity-color) 30%,var(--bg))}.github-day[data-level="2"]{background:color-mix(in srgb,var(--activity-color) 53%,var(--bg))}.github-day[data-level="3"]{background:color-mix(in srgb,var(--activity-color) 76%,var(--bg))}.github-day[data-level="4"]{background:var(--activity-color)}.github-calendar-footer,.github-legend,.github-chart-dates{justify-content:space-between;align-items:center;gap:.4rem;display:flex}.github-legend .github-day{width:10px}.github-recent{border-top:1px solid var(--line);margin-top:1.5rem;padding-top:1.5rem}.github-recent p{color:var(--muted);margin-top:.4rem;font-size:.7rem}.github-bars{width:100%;height:auto;max-height:120px;margin-top:1rem;overflow:visible}.github-bars rect{fill:var(--activity-color)}.github-bars rect[data-level="0"]{fill:var(--fill)}.github-data{border-top:1px solid var(--line);margin-top:1.5rem;padding-top:.5rem}.github-data summary{cursor:pointer;min-height:44px;padding:.75rem 0;font-size:.7rem}.github-data p,.github-error p{color:var(--muted);font-size:.75rem;line-height:1.7}.github-table-scroll{max-height:250px;margin-top:1rem;overflow:auto}.github-data table{text-align:left;border-collapse:collapse;width:100%;font-size:.7rem}.github-data th,.github-data td{border-bottom:1px solid var(--line);padding:.5rem}.github-data caption{text-align:left;color:var(--muted);margin-bottom:.5rem}.github-source{margin-top:1rem;line-height:1.7}.github-loading,.github-error{padding:2rem 0}.github-loading{color:var(--muted);font-size:.8rem}.github-loading>div{background:var(--subtle);border-radius:4px;height:130px;margin-top:1rem}.github-error h3{margin-bottom:.65rem}@media (width<=767px){.github-panel{padding:1rem}.github-stats{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.4rem 1rem}.github-calendar-header{flex-direction:column;align-items:start;gap:.5rem}.github-calendar-footer{flex-direction:column;align-items:start;gap:.8rem}}@media (prefers-contrast:more){.github-day{border:1px solid var(--muted)}}:root[data-season]{--season-line:#8b7a87;--season-ground:#d8c9bf;--season-shadow:#463d50;--season-ghost:#e4dce9;--season-cloth:#69516e;--season-evergreen:#315b4a;--season-snowcap:#f0f4f2;--season-snow:#647d88}:root[data-season=halloween]{--season-accent:#9a3412}:root[data-season=christmas]{--season-accent:#166534;--season-line:#718b7a;--season-ground:#dbe7e5}:root[data-theme=dark][data-season]{--season-line:#776c80;--season-ground:#302832;--season-shadow:#c1b4cf;--season-ghost:#b4b1c4;--season-cloth:#7b6594;--season-evergreen:#4d7965;--season-snowcap:#c9dbd8;--season-snow:#e4f2fa}:root[data-theme=dark][data-season=halloween]{--season-accent:#fdba74}:root[data-theme=dark][data-season=christmas]{--season-accent:#86efac;--season-line:#8aa695;--season-ground:#273b37}:root[data-season=halloween]{--bg:#e8dfd2;--ink:#302535;--muted:#625064;--subtle:#ded2c3;--fill:#d6c5b4;--line:#bba89b;--strong-line:#917461;--shadow:0 8px 22px -14px #582a2340;--season-heading:#7b351f;--season-portrait-web:#e9d6c2;--season-line:#736372}:root[data-theme=dark][data-season=halloween]{--bg:#140e1c;--ink:#f4e9d6;--muted:#c4a9c7;--subtle:#21172c;--fill:#302039;--line:#49334e;--strong-line:#77566c;--shadow:0 12px 32px -18px #0009;--season-heading:#f6b76d;--season-portrait-web:#f1dfc5}:root[data-season=christmas]{--bg:#f1f6f2;--ink:#173a30;--muted:#49665b;--subtle:#e5efe8;--fill:#d8e8dc;--line:#b8d1bf;--strong-line:#7a9e86;--shadow:0 8px 22px -14px #214a3540;--season-heading:#165338}:root[data-theme=dark][data-season=christmas]{--bg:#080f19;--ink:#eaf4eb;--muted:#b1cabc;--subtle:#10212a;--fill:#1b323a;--line:#304650;--strong-line:#638774;--shadow:0 12px 32px -18px #0009;--season-heading:#b9d7b8}:root[data-season=halloween] body{background-image:radial-gradient(at 90% 0,#b6622420,#0000 55%),radial-gradient(at 0 100%,#79519616,#0000 60%);background-attachment:fixed}:root[data-season=christmas] body{background-image:radial-gradient(at 100% 0,#8eae9620,#0000 55%),radial-gradient(at 0 100%,#ae54430c,#0000 60%);background-attachment:fixed}:root[data-season] .hero h1,:root[data-season] .section-heading h2{color:var(--season-heading)}:root[data-season] .project-stack span,:root[data-season] .stack-list span{background:var(--subtle)}:root[data-season] .hero-portrait{border-color:var(--season-accent)}:root[data-season=halloween] .hero-portrait{box-shadow:0 12px 30px -16px #ad4d2870}:root[data-season=christmas] .hero-portrait{box-shadow:0 12px 30px -16px #3b725460}:root[data-season=halloween] .section-block{position:relative}:root[data-season=halloween] .section-block:after{content:"";background:var(--season-accent);opacity:.25;pointer-events:none;width:64px;height:64px;position:absolute;top:0;right:0;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cg fill='none' stroke='black' stroke-width='1.5'%3E%3Cpath d='M0 0h100v100M25 0v20h20v20h20v20h18v20h17M50 0v16h18v18h16v18h16M75 0v12h13v13h12M0 0l100 100M25 0l75 100M50 0l50 100'/%3E%3C/g%3E%3C/svg%3E") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cg fill='none' stroke='black' stroke-width='1.5'%3E%3Cpath d='M0 0h100v100M25 0v20h20v20h20v20h18v20h17M50 0v16h18v18h16v18h16M75 0v12h13v13h12M0 0l100 100M25 0l75 100M50 0l50 100'/%3E%3C/g%3E%3C/svg%3E") 50%/contain no-repeat}.hero-portrait .portrait-seasonal{z-index:1;pointer-events:none;border-radius:10px;width:100%;height:100%;position:absolute;inset:0}.hero-portrait .portrait-toggle{z-index:2}.season-weather[data-weather=christmas]{z-index:5}.season-weather[data-weather=christmas] .season-snowflake{opacity:.5;border-radius:50%}:root[data-season=halloween] .season-web-corner{opacity:.6;width:clamp(64px,7vw,112px)}.site-shell{isolation:isolate;position:relative}.theme-control{justify-content:flex-start;gap:.65rem}.season-control{margin-right:auto;position:relative}.icon-button.season-toggle{color:var(--season-accent,var(--muted))}.season-glyph{width:20px;height:20px}.season-picker{border:1px solid var(--strong-line);background:var(--bg);width:min(270px,100vw - 16px);max-height:calc(100dvh - 16px);color:var(--ink);z-index:30;opacity:0;transition:opacity .18s cubic-bezier(.23,1,.32,1), transform .18s cubic-bezier(.23,1,.32,1), display .18s allow-discrete, overlay .18s allow-discrete;pointer-events:none;border-radius:12px;margin:0;padding:1rem;display:none;position:fixed;inset:auto;overflow:auto;transform:scale(.97);box-shadow:0 12px 32px -12px #0005}.season-picker:popover-open{opacity:1;pointer-events:auto;display:grid;transform:scale(1)}.season-picker[data-fallback-open=true]{opacity:1;pointer-events:auto;display:grid;transform:scale(1)}@starting-style{:is(.season-picker:popover-open,.season-picker[data-fallback-open=true]){opacity:0;transform:scale(.97)}}.season-picker[data-instant=true]{transition:none}.season-picker fieldset{border:0;min-width:0;margin:0;padding:0}.season-picker legend{margin-bottom:.8rem;padding:0;font-size:.9rem;font-weight:600}.season-option{cursor:pointer;border:1px solid #0000;border-radius:6px;align-items:center;gap:.7rem;min-height:44px;padding:.65rem .6rem;font-size:.85rem;display:flex}.season-option[data-selected=true]{background:var(--fill);border-color:var(--strong-line)}.season-option input{margin-left:auto}.season-option .season-glyph{color:var(--season-accent,var(--ink))}.season-option:focus-within{outline:2px solid var(--ink);outline-offset:2px}.season-motion{border-top:1px solid var(--line);cursor:pointer;justify-content:space-between;align-items:center;gap:.8rem;min-height:44px;margin-top:.8rem;padding-top:.8rem;font-size:.77rem;display:flex}.season-picker input{accent-color:var(--season-accent,var(--ink));flex:0 0 16px;width:16px;height:16px}.season-device-note{color:var(--muted);max-width:28ch;margin-top:.5rem;font-size:.72rem}.season-stage{pointer-events:none;grid-column:1/-1;width:100%;height:112px;position:relative;overflow:hidden}.season-scene-layer{opacity:0;transition:opacity .2s cubic-bezier(.23,1,.32,1);position:absolute;inset:0}.season-scene-layer[data-active=true]{opacity:1}@starting-style{.season-scene-layer[data-active=true]{opacity:0}}.season-scene-layer[data-active=false] .season-animate{animation:none!important}:root[data-season-instant=true] .season-scene-layer{transition:none}.season-stage .season-art{width:900px;max-width:none;height:112px;position:absolute;bottom:0;right:0}.season-weather{z-index:5;pointer-events:none;position:fixed;inset:0;overflow:hidden}.season-web-corner{width:clamp(48px,5vw,88px);color:var(--season-line);opacity:.5;position:absolute;top:0;right:0;transform:scaleX(-1)}.season-web-corner .season-web{width:100%;height:auto}.season-web-left{left:0;right:auto;transform:none}.season-web-bottom{top:auto;bottom:0;transform:scale(-1)}.season-edge-spider{width:30px;height:36px;color:var(--ink);animation:14s ease-in-out -4s infinite season-spider-travel;position:absolute;top:28px}.season-edge-spider-left{left:25px}.season-edge-spider-right{animation-duration:19s;animation-delay:-12s;right:25px}.season-edge-spider svg{width:100%;height:100%}.spider-silk{background:var(--season-line);opacity:.7;width:1px;height:100vh;position:absolute;bottom:calc(100% - 12px);left:50%}.season-lightning{opacity:0;background:radial-gradient(at 90% 0,#e6dbfa33,#0000 65%);animation:17s linear -7s infinite season-storm;position:absolute;inset:0}.season-lightning-streak{fill:none;width:clamp(70px,10vw,160px);height:68vh;stroke:var(--season-line);stroke-width:2px;filter:drop-shadow(0 0 3px #e7d7fa);position:absolute;top:0;right:0}.season-lightning-far{opacity:.55;width:70px;left:0;right:auto;transform:scaleX(-1)}@keyframes season-spider-travel{0%,to{transform:translateY(0)}45%,55%{transform:translateY(210px)}}@keyframes season-storm{0%,69%,73%,to{opacity:0}70%{opacity:.85}72%{opacity:.2}}:root[data-season-motion=off] .season-lightning,:root[data-season-hidden] .season-lightning,:root[data-theme-reveal] .season-lightning{visibility:hidden}:root:has(dialog[open]) .season-lightning{visibility:hidden}.season-snowflake{top:-8px;left:var(--snow-x);width:var(--snow-size);height:var(--snow-size);background:var(--season-snow);opacity:.3;animation:season-snowfall var(--snow-duration) linear var(--snow-delay) infinite;position:absolute}.season-chrome-lights{pointer-events:none;z-index:20;justify-content:space-around;align-items:flex-start;width:100%;height:12px;display:flex;position:fixed;top:0;left:0}.season-chrome-lights:before{content:"";background:var(--season-evergreen);height:2px;position:absolute;top:0;left:0;right:0}.season-chrome-lights span{background:#d9b661;border-bottom:2px solid #a9564d;width:5px;height:9px;margin-top:2px;position:relative}.season-chrome-lights span:nth-child(3n){background:#8aaa8a;border-color:#4c7660}.season-chrome-lights span:nth-child(3n+1){background:#c86c61;border-color:#985047}.christmas-top-greenery{top:2px;z-index:6;pointer-events:none;height:64px;position:fixed;inset-inline:0}.christmas-mistletoe{width:48px;height:60px;position:absolute;top:0;right:12px}.christmas-mistletoe:first-child{left:12px;right:auto}.season-aurora{z-index:-1;pointer-events:none;opacity:.3;height:65vh;display:none;position:fixed;inset:-8vh -8vw auto;overflow:hidden}.season-aurora svg{filter:blur(14px);width:100%;height:100%}:root[data-theme=dark][data-season=christmas] .season-aurora{animation:28s ease-in-out -8s infinite season-aurora;display:block}@keyframes season-aurora{0%,12%,90%,to{opacity:0;transform:translate(-3vw,-2vh)scale(1.04)}40%,58%{opacity:.48;transform:translate(3vw,2vh)scale(1)}}:root[data-season-motion=off] .season-aurora{opacity:.22;animation:none!important}.lantern-light{opacity:.8;animation:3.4s cubic-bezier(.77,0,.175,1) infinite alternate season-lamplight}.christmas-light{opacity:.9;animation:season-lamplight 3.4s cubic-bezier(.77,0,.175,1) var(--light-delay,0s) infinite alternate}.seasonal-spider{animation:.48s cubic-bezier(.23,1,.32,1) both season-spider-arrive}:root[data-season-motion=off] .season-animate,:root[data-season-hidden] .season-animate,:root[data-theme-reveal] .season-animate{animation-play-state:paused!important}:root:has(dialog[open]) .season-animate{animation-play-state:paused!important}@keyframes season-snowfall{0%{transform:translateY(-8px)}to{transform:translate3d(var(--snow-drift),calc(100dvh + 16px),0)}}@keyframes season-lamplight{0%{opacity:.45}to{opacity:1}}@keyframes season-spider-arrive{0%{transform:translateY(-44px)}to{transform:translateY(0)}}@media (width>=1024px){.season-chrome-lights{width:calc(100% - 14rem);left:14rem}.christmas-top-greenery,.season-web-left,.season-lightning-far{left:14rem}:root[data-season=halloween] .season-web-left{width:clamp(56px,5vw,80px)}.season-edge-spider-left{left:calc(14rem + 4px)}}@media (width<=1023px){:root[data-season=halloween] .season-web-corner{opacity:.3;width:36px}.season-web-corner:not(.season-web-bottom){top:5rem}.season-edge-spider{width:16px;height:22px;top:110px}.season-edge-spider-left{left:-2px}.season-edge-spider-right{right:-2px}.christmas-top-greenery{height:36px;top:5rem}.christmas-mistletoe{width:25px;height:32px;right:0}.christmas-mistletoe:first-child{left:0}}@media (width<=767px){.season-stage{height:80px}.season-stage .season-art{transform-origin:100% 100%;transform:scale(.714286)}.season-stage .christmas-art{width:640px}.season-snowflake:nth-child(n+49),.season-chrome-lights span:nth-child(n+13){display:none}:root[data-season=halloween] .season-web-corner{opacity:.3;width:36px;display:block}:root[data-season=halloween] .season-web-corner:not(.season-web-bottom){top:5rem}.season-lightning-streak{opacity:.5;width:44px}:root[data-season=halloween] .section-block:after{width:44px;height:44px}}@media (prefers-reduced-motion:reduce){.season-animate{animation:none!important}.season-snowflake,.season-lightning{display:none}:root[data-theme=dark][data-season=christmas] .season-aurora{opacity:.22}.season-picker,.season-scene-layer{transition:none}}@media (prefers-reduced-transparency:reduce){.season-picker{background:var(--bg);box-shadow:none}.season-web-corner{opacity:.65}}@media (prefers-contrast:more){.season-picker,.season-option[data-selected=true]{border-color:var(--ink)}.season-snowflake,.season-lightning{display:none}.season-web-corner{opacity:.3}}@media (prefers-contrast:more),(prefers-reduced-transparency:reduce){.season-aurora{display:none!important}}@media (prefers-contrast:more){:root[data-season][data-theme]{--line:var(--ink);--strong-line:var(--ink);--muted:var(--ink)}:root[data-season] body{background-image:none}}@font-face{font-family:Geist;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-latin-400-normal-B40WzpMT.woff2)format("woff2"),url(/assets/geist-latin-400-normal-akEymXtG.woff)format("woff")}@font-face{font-family:Geist;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-latin-500-normal-CTWBw9NS.woff2)format("woff2"),url(/assets/geist-latin-500-normal-BDXIbFrL.woff)format("woff")}@font-face{font-family:Geist;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/geist-latin-600-normal-CSETrqM2.woff2)format("woff2"),url(/assets/geist-latin-600-normal-DsPlZH-9.woff)format("woff")}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-400-normal-DTRLJnHl.woff2)format("woff2"),url(/assets/geist-mono-latin-400-normal-B2yvC1Cq.woff)format("woff")}html.lenis,html.lenis body{height:auto}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:clip}.lenis [data-lenis-prevent],.lenis [data-lenis-prevent-wheel],.lenis [data-lenis-prevent-touch],.lenis [data-lenis-prevent-vertical],.lenis [data-lenis-prevent-horizontal]{overscroll-behavior:contain}.lenis.lenis-smooth iframe{pointer-events:none}.lenis.lenis-autoToggle{transition-behavior:allow-discrete;transition-property:overflow;transition-duration:1ms}@font-face{font-family:Geist Pixel;src:url(/assets/GeistPixel-Square-B0mEoKr8.woff2)format("woff2");font-style:normal;font-weight:400;font-display:swap}:root{font-synthesis:none;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#fff;--ink:#0a0a0a;--muted:#626262;--subtle:#fafafa;--fill:#f5f5f5;--line:#e9e9e9;--strong-line:#d4d4d4;--shadow:0 8px 22px -14px #0004;--ease:cubic-bezier(.16,1,.3,1);scroll-padding-top:6.5rem;font-family:Geist,system-ui,sans-serif;font-size:15px;line-height:1.6}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0c0c0f;--ink:#f4f4f5;--muted:#a0a0a8;--subtle:#18181b;--fill:#1e1e22;--line:#2a2a30;--strong-line:#3a3a42;--shadow:none}@media (prefers-color-scheme:dark){:root:not([data-theme]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0c0c0f;--ink:#f4f4f5;--muted:#a0a0a8;--subtle:#18181b;--fill:#1e1e22;--line:#2a2a30;--strong-line:#3a3a42}}*{box-sizing:border-box;scrollbar-width:thin;scrollbar-color:var(--strong-line) transparent}body{background:var(--bg);min-width:min(320px,100%);color:var(--ink);-webkit-font-smoothing:antialiased;margin:0}body,button,input,textarea,select{font-family:Geist,system-ui,sans-serif}body,.site-header,.modal,button,input,textarea,select{transition:background-color .5s,color .5s,border-color .5s}h1,h2,h3,h4,p{margin:0}h1,h2,h3{text-wrap:balance;font-weight:500;line-height:1.2}a{color:inherit;-webkit-text-decoration-color:color-mix(in srgb, var(--ink) 25%, transparent);text-decoration-color:color-mix(in srgb, var(--ink) 25%, transparent);text-underline-offset:3px}a:hover{text-decoration-color:currentColor}button,select{color:inherit;cursor:pointer}button{font-size:inherit}button,a{-webkit-tap-highlight-color:transparent;touch-action:manipulation}button:disabled{cursor:not-allowed;opacity:.5}button:active:not(:disabled),.button:active{transform:scale(.97)}img{max-width:100%;height:auto;display:block}svg{stroke-width:1.7px;flex-shrink:0;width:1.1em;height:1.1em}::selection{background:var(--ink);color:var(--bg)}:focus-visible{outline:2px solid var(--ink);outline-offset:4px}section[tabindex="-1"]:focus,main[tabindex="-1"]:focus{outline:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip-link{z-index:100;background:var(--ink);color:var(--bg);padding:.75rem 1rem;position:fixed;top:.5rem;left:1rem;transform:translateY(-160%)}.skip-link:focus{transform:none}.site-header{z-index:10;border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--bg) 92%, transparent);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);justify-content:space-between;align-items:center;min-height:5rem;padding:.8rem 1rem;display:flex;position:sticky;top:0}.identity{align-items:center;gap:.8rem;font-size:.9rem;font-weight:600;text-decoration:none;display:flex}.identity-mark{font-family:Geist Pixel,monospace;font-size:2rem;font-weight:400}.identity-caption{color:var(--muted);font-size:.68rem;font-weight:400;display:block}.desktop-navigation{display:none}.page-content{max-width:60rem;margin:0 auto;padding:0 1.5rem}.hero{isolation:isolate;grid-template-columns:1fr 12rem;align-items:center;gap:2.5rem;padding:4rem 0 3.5rem;display:grid;position:relative}.hero:before{content:"";z-index:-1;background:radial-gradient(circle, var(--ink) .8px, transparent 1px) 0 0/9px 9px;opacity:.22;pointer-events:none;width:min(20rem,100%);height:17rem;position:absolute;top:1rem;right:0;-webkit-mask-image:radial-gradient(#000 5%,#0000 68%);mask-image:radial-gradient(#000 5%,#0000 68%)}.hero-greeting{margin-bottom:.9rem;font-size:.9rem}.hero h1{letter-spacing:-.025em;max-width:17ch;font-family:Geist Pixel,Geist Mono,monospace;font-size:clamp(2rem,4.2vw,3rem);font-weight:400;line-height:1.08}.display-period{color:var(--muted)}.hero-intro{color:var(--muted);max-width:48ch;margin-top:1.25rem;font-size:.95rem}.hero-actions{flex-wrap:wrap;align-items:center;gap:1.25rem;margin-top:1.7rem;display:flex}.hero-portrait{border:1px solid var(--line);background:var(--bg);box-shadow:var(--shadow);border-radius:12px;padding:.35rem;position:relative;transform:rotate(3deg)}.portrait-viewport{aspect-ratio:4/5;filter:grayscale();border-radius:8px;width:100%;transition:filter .35s;position:relative;overflow:hidden}.hero-portrait.is-color .portrait-viewport{filter:none}.portrait-viewport .portrait-original{object-fit:cover;object-position:center;width:100%;height:100%}.portrait-original.is-hidden{opacity:0}.portrait-viewport .portrait-atlas{width:750%;max-width:none;height:600%;left:calc(-12.5% - var(--pose-column) * 125%);top:calc(var(--pose-row) * -100%);opacity:0;pointer-events:none;position:absolute}.portrait-atlas.is-active{opacity:1}.portrait-toggle.icon-button{color:#fff;background:0 0;border:0;border-radius:50%;position:absolute;bottom:.35rem;right:.35rem}.portrait-toggle.icon-button:hover{background:0 0}.portrait-toggle:focus-visible{outline-offset:-5px;outline-color:#fff}.portrait-toggle svg{filter:drop-shadow(0 1px 2px #000);width:18px;height:18px}.button,.icon-button{border:1px solid var(--strong-line);background:var(--bg);min-height:44px;color:var(--ink);border-radius:8px;justify-content:center;align-items:center;gap:.5rem;padding:.7rem 1rem;font-size:.8rem;font-weight:500;text-decoration:none;transition:background-color .2s,color .2s,transform .1s;display:inline-flex}.button:hover,.icon-button:hover{background:var(--fill)}.button-primary{background:var(--ink);color:var(--bg);border-color:var(--ink)}.button-primary:hover{background:var(--ink);opacity:.86}.icon-button{flex:0 0 44px;width:44px;height:44px;padding:0}.text-link{min-height:44px;text-decoration:underline;-webkit-text-decoration-color:var(--strong-line);text-decoration-color:var(--strong-line);text-underline-offset:3px;color:var(--ink);background:0 0;border:0;align-items:center;gap:.4rem;padding:.5rem 0;font-size:.85rem;display:inline-flex}.text-link svg,.project-footer svg{transition:transform .18s var(--ease)}@media (hover:hover) and (pointer:fine){.text-link:hover svg,.project-footer a:hover svg{transform:translate(2px,-2px)}}.section-block{border-top:1px solid var(--line);padding:3.5rem 0}.section-heading{margin-bottom:2rem}.section-heading h2{letter-spacing:-.02em;font-family:Geist Pixel,Geist Mono,monospace;font-size:clamp(1.5rem,3vw,2rem);font-weight:400}.section-number{color:var(--muted);font-size:.7em}.section-heading>p{color:var(--muted);max-width:65ch;margin-top:.8rem;font-size:.86rem}.project-list{gap:2.5rem;display:grid}.project{grid-template-columns:1.1fr 1fr;align-items:start;gap:1.75rem;display:grid}.project+.project{border-top:1px solid var(--line);padding-top:2.5rem}.project-media{position:sticky;top:6.5rem}.project-image-button{border:1px solid var(--line);background:var(--subtle);width:100%;box-shadow:var(--shadow);text-align:left;transition:box-shadow .2s, transform .2s var(--ease);border-radius:16px;padding:.7rem;display:block;overflow:hidden}.project-image-button img{aspect-ratio:4/3;object-fit:contain;border-radius:8px;width:100%;height:auto}.project-image-hint{color:var(--muted);align-items:center;gap:.4rem;padding:.75rem .1rem .1rem;font-family:Geist Mono,monospace;font-size:.65rem;display:flex}.project-image-hint svg:last-child{margin-left:auto}.project-meta{color:var(--muted);text-transform:uppercase;letter-spacing:.03em;flex-wrap:wrap;justify-content:space-between;gap:.5rem;margin-bottom:.6rem;font-family:Geist Mono,monospace;font-size:.75rem;display:flex}.project h3{letter-spacing:-.02em;font-size:1.35rem;font-weight:600}.project-copy>p{color:var(--muted);margin-top:.7rem;font-size:.95rem}.project-contribution strong{color:var(--ink);font-weight:500}.project-status{color:var(--ink);text-transform:none}.project-copy>.project-summary{color:var(--ink);font-size:.95rem;line-height:1.5}.project-stack,.stack-list{flex-wrap:wrap;gap:.4rem;margin-top:1rem;display:flex}.project-stack span,.stack-list span{border:1px solid var(--strong-line);color:var(--muted);border-radius:999px;padding:.2rem .55rem;font-family:Geist Mono,monospace;font-size:.75rem;line-height:1.5}.project-group-title{margin-bottom:1.5rem;font-size:1rem;font-weight:500}.other-projects{border-top:1px solid var(--line);margin-top:3rem;padding-top:2.5rem}.other-project-grid{grid-template-columns:1fr 1fr;gap:2.5rem 1.5rem;display:grid}.project.project-compact{border:0;flex-direction:column;gap:1.2rem;min-width:0;padding:0;display:flex}.project-compact .project-media{width:100%;position:static}.project-compact .project-copy{flex-direction:column;flex:1;width:100%;display:flex}.project-compact .project-meta{font-size:.75rem}.project-compact .project-summary{margin-bottom:1rem;font-size:.85rem}.project-compact .project-footer{margin-top:auto}.project-compact .project-image-button img{aspect-ratio:16/10}.project-footer{border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:1rem;margin-top:.7rem;padding-top:.5rem;font-size:.85rem;display:flex}.project-footer a,.project-footer button{min-height:44px;color:var(--ink);font-size:inherit;background:0 0;border:0;align-items:center;gap:.25rem;padding:0;display:inline-flex}.project-footer span{color:var(--muted)}.approach-grid{border-top:1px solid var(--line);border-bottom:1px solid var(--line);grid-template-columns:repeat(3,1fr);display:grid}.approach-grid article{padding:1.4rem 1.25rem}.approach-grid article:first-child{padding-left:0}.approach-grid article+article{border-left:1px solid var(--line)}.approach-grid article>span{color:var(--muted);font:.65rem Geist Mono,monospace}.approach-grid h3{margin:.6rem 0;font-size:1rem}.approach-grid p{color:var(--muted);font-size:.9rem}.stack-line{margin-top:1.5rem}.stack-line h3,.skills>h3{font-size:.9rem}.skills{margin-top:2rem}.content-disclosure>summary{cursor:pointer;min-height:44px;padding-block:.75rem;font-size:.9rem;font-weight:500}.content-disclosure[open]>summary{margin-bottom:.5rem}.availability{color:var(--ink);font-weight:500}.project-share{flex-wrap:wrap;align-items:center;gap:.5rem 1.5rem;display:flex}.project-share>p{color:var(--muted);flex-basis:100%}.project-share>p:empty{display:none}.skills-groups{margin-top:1rem}.skill-group{border-top:1px solid var(--line);grid-template-columns:11rem 1fr;gap:1.5rem;padding:1rem 0;display:grid}.skill-group h4{font-size:.9rem;font-weight:500}.skill-group p{color:var(--muted);font-size:.95rem}.certificate-grid{grid-template-columns:1fr 1fr;gap:1.5rem;display:grid}.certificate{min-width:0}.certificate-preview{background:var(--subtle);border:1px solid var(--line);text-align:left;width:100%;box-shadow:var(--shadow);border-radius:12px;padding:.65rem;display:block;overflow:hidden}.certificate-preview img{aspect-ratio:792/612;object-fit:contain;border-radius:6px;width:100%;height:auto}.certificate-preview>span{min-height:36px;color:var(--muted);justify-content:space-between;align-items:center;padding:.4rem .2rem 0;font:.65rem Geist Mono,monospace;display:flex}.certificate-copy{padding:1rem .2rem 0}.certificate-kind{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font:.62rem Geist Mono,monospace}.certificate h3{margin:.55rem 0;font-size:1.1rem;line-height:1.4}.certificate-copy>p:not(.certificate-kind){color:var(--muted);font-size:.9rem}.certificate-copy time{color:var(--muted);margin:.6rem 0;font:.67rem Geist Mono,monospace;display:block}.contact-layout{grid-template-columns:.8fr 1.2fr;gap:2.5rem;display:grid}.social-links{flex-wrap:wrap;gap:.8rem;display:flex}.social-links a{align-items:center;gap:.3rem;min-height:44px;font-size:.75rem;display:inline-flex}.resume-card{border:1px solid var(--line);background:var(--subtle);border-radius:12px;margin-top:1.2rem;padding:1.25rem}.resume-card>svg{color:var(--muted);width:1.4rem;height:1.4rem;margin-bottom:.7rem}.resume-card h3{font-size:1.05rem}.resume-card p{color:var(--muted);margin-top:.7rem;font-size:.8rem}.resume-actions{flex-wrap:wrap;align-items:center;gap:.8rem;margin-top:1rem;display:flex}.resume-card .fine-print,.fine-print{color:var(--muted);font-size:.7rem}.contact-form{gap:1rem;display:grid}.field-row{grid-template-columns:1fr 1fr;gap:.75rem;display:grid}.field{gap:.5rem;font-size:.75rem;display:grid}.field input,.field textarea{border:1px solid var(--strong-line);background:var(--subtle);width:100%;min-width:0;color:var(--ink);caret-color:var(--ink);resize:vertical;border-radius:6px;padding:.8rem;font-size:.87rem}.field small{color:var(--ink);font-size:.7rem}.field [aria-invalid=true]{border-color:var(--ink)}.honeypot{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.form-note,.form-status{color:var(--muted);font-size:.78rem}.form-status:empty{display:none}.form-status.error{color:var(--ink)}.submit-button{justify-self:start}.turnstile{width:100%;min-width:0}.footer{border-top:1px solid var(--line);color:var(--muted);flex-wrap:wrap;justify-content:space-between;gap:.75rem;padding:1.5rem 0 2rem;font:.62rem/1.7 Geist Mono,monospace;display:flex}.footer span:last-child{flex-basis:100%}nav a{min-height:44px;color:var(--muted);align-items:center;gap:.8rem;padding:.65rem 0;font-size:.85rem;text-decoration:none;display:flex}nav a[aria-current],nav a:hover{color:var(--ink)}.nav-number{font:.6rem Geist Mono,monospace}.nav-arrow{opacity:0;margin-left:auto}nav a[aria-current] .nav-arrow,nav a:hover .nav-arrow{opacity:1}.theme-control{color:var(--muted);border-top:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;margin-top:1.5rem;padding-top:1.5rem;font-size:.7rem;display:flex}.theme-toggle{color:var(--muted)}.theme-toggle:hover,.theme-toggle:focus-visible{color:var(--ink)}:root[data-theme-reveal] *,:root[data-theme-reveal]{transition:none!important}:root[data-theme-reveal]::view-transition{pointer-events:none}:root[data-theme-reveal]::view-transition-group(root){animation:none}:root[data-theme-reveal]::view-transition-image-pair(root){isolation:isolate}:root[data-theme-reveal]::view-transition-old(root){mix-blend-mode:normal;animation:none}:root[data-theme-reveal]::view-transition-new(root){mix-blend-mode:normal;animation:none}:root[data-theme-reveal]::view-transition-old(root){z-index:1}:root[data-theme-reveal]::view-transition-new(root){z-index:2}.modal{border:1px solid var(--strong-line);background:var(--bg);width:min(960px,100% - 2rem);max-height:calc(100dvh - 2rem);color:var(--ink);overscroll-behavior:contain;border-radius:16px;margin:auto;padding:1.5rem;overflow:auto;box-shadow:0 40px 90px -20px #0006}.modal[open]{animation:modal-enter .2s var(--ease)}.modal::backdrop{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0007}.modal-header{justify-content:space-between;align-items:center;gap:1rem;margin-bottom:1rem;display:flex}.modal-header h2{letter-spacing:-.02em;font-size:1.3rem}.menu-modal{width:100%;height:100dvh;max-height:100dvh;padding:max(1rem,env(safe-area-inset-top)) 1.5rem;border:0;border-radius:0;margin:0}.menu-modal nav{margin-top:2rem}.menu-modal nav a{border-bottom:1px solid var(--line);padding:1.2rem 0;font-size:1.5rem}.menu-modal .theme-control{max-width:22rem}.gallery-stage{background:var(--subtle);border:1px solid var(--line);border-radius:12px;justify-content:center;min-height:15rem;padding:1rem;display:flex}.gallery-stage img{object-fit:contain;width:auto;height:auto;max-height:60dvh}.gallery-controls{justify-content:center;align-items:center;gap:1rem;margin:1rem 0 .5rem;display:flex}.gallery-controls p{font:.75rem Geist Mono,monospace}.gallery-caption{color:var(--muted);text-align:center;font-size:.8rem}.gallery-thumbnails{gap:.6rem;margin-top:.7rem;padding:.5rem;display:flex;overflow:auto}.gallery-thumbnails button{border:1px solid var(--line);background:var(--subtle);border-radius:8px;flex:0 0 5rem;padding:.25rem}.gallery-thumbnails button[aria-pressed=true]{border-color:var(--ink)}.gallery-thumbnails img{object-fit:contain;width:100%;height:3.5rem}.project-modal{width:min(56rem,100% - 2rem);padding:0}.project-modal .modal-header{z-index:1;border-bottom:1px solid var(--line);background:var(--bg);margin:0;padding:1rem 1.5rem;position:sticky;top:0}.project-modal-content{gap:2rem;padding:1.5rem;display:grid}.project-modal-content h3{margin-bottom:.7rem;font-size:1rem}.project-modal-content p,.project-feature-list li{max-width:72ch;font-size:1rem}.project-overview>p+p{margin-top:.75rem}.project-overview .project-context{color:var(--muted);font-size:.75rem}.project-role{flex-wrap:wrap;gap:.5rem .75rem;margin:1rem 0 1.25rem;font-size:.9rem;display:flex}.project-role dt{color:var(--muted)}.project-role dd{margin:0}.project-feature-list ul{padding-left:1.2rem}.project-feature-list li+li{margin-top:.8rem}.project-source{justify-self:start}.project-modal .gallery-stage{align-items:center}.project-modal .gallery-stage img{max-width:100%;max-height:50dvh}.project-modal .gallery-controls p{max-width:none}.certificate-full{overflow:auto}.certificate-full img{width:100%}.certificate-modal-footer{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;margin-top:1rem;display:flex}.certificate-modal-footer p{color:var(--muted);max-width:65ch;font-size:.75rem}.resume-modal{flex-direction:column;height:min(950px,100dvh - 2rem);display:flex;overflow:hidden}.resume-modal:not([open]){display:none}.resume-modal .modal-header{flex:none}.resume-verification{justify-items:start;gap:1rem;width:min(100%,360px);margin:auto;padding:1rem 0;display:grid;overflow:auto}.verification-icon{width:2rem;height:2rem}.resume-verification h3{font-size:1.35rem}.resume-verification p{color:var(--muted);font-size:.85rem}.resume-file-actions{flex-wrap:wrap;align-items:center;gap:1rem;padding-bottom:.7rem;display:flex}.pdf-reader{border:1px solid var(--line);border-radius:8px;flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.pdf-toolbar{border-bottom:1px solid var(--line);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:.5rem;padding:.35rem .7rem;font:.7rem Geist Mono,monospace;display:flex}.pdf-toolbar>div{align-items:center;gap:.5rem;display:flex}.pdf-toolbar .icon-button{border:none}.pdf-toolbar output{text-align:center;min-width:4ch}.pdf-toolbar .text-link{font-size:.7rem}.pdf-scroll{background:var(--fill);overscroll-behavior:contain;flex:1;min-height:0;padding:16px;overflow:auto}.pdf-page-wrap{width:max-content;min-width:100%;margin-bottom:1rem}.pdf-page{color:#000;background:#fff;margin-inline:auto;position:relative;box-shadow:0 4px 12px #0002}.pdf-page canvas{display:block}.pdf-page .textLayer{z-index:1}.pdf-link{z-index:2;position:absolute}.pdf-link:hover{background:#0001}.reader-status{padding:1.5rem;font-size:.85rem}.spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}@keyframes modal-enter{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}@media (hover:hover) and (pointer:fine){.project-image-button:hover{transform:translateY(-2px);box-shadow:0 18px 36px -20px #0006}}@media (width>=1024px){:root{scroll-padding-top:2rem}.site-header{border-bottom:0;border-right:1px solid var(--line);-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--bg);flex-direction:column;justify-content:start;align-items:stretch;width:14rem;min-height:100dvh;padding:2rem 1.25rem;position:fixed;inset:0 auto 0 0}.identity{flex-direction:column;align-items:flex-start;gap:1rem}.identity-mark{font-size:3rem}.identity-caption{margin-top:.25rem}.desktop-navigation{flex-direction:column;flex:1;margin-top:3rem;display:flex}.mobile-menu-toggle{display:none}.sidebar-links{justify-content:space-between;gap:.5rem;margin-top:auto;padding-top:2rem;font:.7rem Geist Mono,monospace;display:flex}.sidebar-links a{align-items:center;gap:.2rem;min-height:44px;display:inline-flex}.sidebar-location{color:var(--muted);margin-top:.8rem;font:.6rem Geist Mono,monospace}.page-content{width:calc(100% - 14rem);max-width:66rem;margin-left:14rem;padding-inline:clamp(2rem,5vw,5rem)}.hero{padding-top:4.5rem}.project-media{top:2rem}}@media (width>=1500px){.page-content{margin-inline:auto;transform:translate(7rem)}}@media (width<=767px){.page-content{padding-inline:1rem}.hero{grid-template-columns:1fr 8rem;gap:1rem;padding-top:2.5rem}.hero h1{font-size:2.15rem}.hero-portrait{align-self:start;margin-top:2.5rem}.hero-intro{font-size:.95rem}.hero-actions{gap:.8rem}.project{grid-template-columns:1fr;gap:1.25rem}.project-media{position:static}.project-image-button img{aspect-ratio:16/10}.project-image-hint,.project-meta{font-size:.75rem}.project-copy>p{font-size:.95rem}.project-stack span{font-size:.75rem}.approach-grid{grid-template-columns:1fr}.approach-grid article,.approach-grid article:first-child{padding:1.25rem 0}.approach-grid article+article{border-left:0;border-top:1px solid var(--line)}.skill-group{grid-template-columns:1fr;gap:.4rem}.certificate-grid,.contact-layout{grid-template-columns:1fr;gap:2rem}.field input,.field textarea{font-size:16px}.section-block{padding-block:2.75rem}.modal{width:calc(100% - 1rem);max-height:calc(100dvh - 1rem);padding:1rem}.resume-modal{width:100%;height:100dvh;max-height:100dvh;padding:max(.75rem,env(safe-area-inset-top)) max(.5rem,env(safe-area-inset-right)) max(.75rem,env(safe-area-inset-bottom)) max(.5rem,env(safe-area-inset-left));border-radius:0;margin:0}.resume-modal .modal-header{padding-inline:.25rem}.pdf-toolbar{padding-inline:.3rem;font-size:.65rem}.pdf-toolbar>div{gap:.1rem}.menu-modal{width:100%;max-height:100dvh;padding:1rem}}@media (width<=380px){.hero{grid-template-columns:1fr}.hero-portrait{width:10rem;margin:0}.hero h1{max-width:17ch}.field-row{grid-template-columns:1fr}.pdf-toolbar>span{flex-basis:100%}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}.project-image-button:hover,.text-link:hover svg,.project-footer a:hover svg{transform:none}}@media (prefers-reduced-transparency:reduce){.site-header{background:var(--bg);-webkit-backdrop-filter:none;backdrop-filter:none}.modal::backdrop{-webkit-backdrop-filter:none;backdrop-filter:none;background:#000b}}@media (prefers-contrast:more){:root{--muted:#333;--line:#888;--strong-line:#555}:root[data-theme=dark]{--muted:#ddd;--line:#888;--strong-line:#aaa}.site-header{background:var(--bg);-webkit-backdrop-filter:none;backdrop-filter:none}}.pdf-page .textLayer{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light only;text-align:initial;letter-spacing:normal;word-spacing:normal;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;forced-color-adjust:none;transform-origin:0 0;caret-color:#000;--min-font-size:1;--text-scale-factor:calc(var(--total-scale-factor) * var(--min-font-size));--min-font-size-inv:calc(1 / var(--min-font-size));line-height:1;position:absolute;inset:0;overflow:clip}.pdf-page .textLayer :is(span,br){color:#0000;white-space:pre;cursor:text;transform-origin:0 0;-webkit-user-select:text;user-select:text;position:absolute}.pdf-page .textLayer>:not(.markedContent),.pdf-page .textLayer .markedContent span:not(.markedContent){z-index:1;--font-height:0;--scale-x:1;--rotate:0deg;font-size:calc(var(--text-scale-factor) * var(--font-height));transform:rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv))}.pdf-page .textLayer .markedContent{display:contents}.pdf-page .textLayer ::selection{color:#0000;background:#0003}.modal{max-width:calc(100% - 2rem)}.menu-modal{max-width:100%}@media (width<=767px){.modal{max-width:calc(100% - 1rem)}.resume-modal,.menu-modal{max-width:100%}.other-project-grid{grid-template-columns:1fr}.project-modal{border:0;border-radius:0;width:100%;max-width:100%;height:100dvh;max-height:100dvh;margin:0;padding:0}.project-modal .modal-header{padding:max(.75rem,env(safe-area-inset-top)) max(1rem,env(safe-area-inset-right)) .75rem max(1rem,env(safe-area-inset-left))}.project-modal-content{padding:1rem max(1rem,env(safe-area-inset-right)) max(1.5rem,env(safe-area-inset-bottom)) max(1rem,env(safe-area-inset-left))}.project-modal .gallery-stage{min-height:12rem;padding:.5rem}.hero{grid-template-columns:minmax(0,1fr) 8rem;grid-template-areas:"greeting greeting""title title""intro portrait""actions actions";row-gap:1.1rem;padding-block:2rem}.hero-copy{display:contents}.hero-greeting{grid-area:greeting;margin:0}.hero h1{grid-area:title;max-width:20ch;font-size:clamp(2rem,7vw,2.65rem)}.hero-intro{grid-area:intro;margin:0}.hero-portrait{grid-area:portrait;width:8rem;margin:.25rem 0 0}.hero-actions{grid-area:actions;gap:.3rem 1rem;margin:.25rem 0 0}}@media (width<=380px){.hero{grid-template-columns:minmax(0,1fr) 8rem;grid-template-areas:"greeting greeting""title title""intro intro""portrait portrait""actions actions"}.hero-portrait{width:10rem}}
