.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}@keyframes astroFadeInOut{0%{opacity:1}to{opacity:0}}@keyframes astroFadeIn{0%{opacity:0;mix-blend-mode:plus-lighter}to{opacity:1;mix-blend-mode:plus-lighter}}@keyframes astroFadeOut{0%{opacity:1;mix-blend-mode:plus-lighter}to{opacity:0;mix-blend-mode:plus-lighter}}@keyframes astroSlideFromRight{0%{transform:translate(100%)}}@keyframes astroSlideFromLeft{0%{transform:translate(-100%)}}@keyframes astroSlideToRight{to{transform:translate(100%)}}@keyframes astroSlideToLeft{to{transform:translate(-100%)}}@media (prefers-reduced-motion){::view-transition-group(*){animation:none!important}::view-transition-old(*){animation:none!important}::view-transition-new(*){animation:none!important}[data-astro-transition-scope]{animation:none!important}}@font-face{font-family:Host Grotesk;font-style:normal;font-weight:300 800;font-display:swap;src:url(/fonts/HostGrotesk-latin.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Host Grotesk;font-style:italic;font-weight:300 800;font-display:swap;src:url(/fonts/HostGrotesk-latin-italic.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0a0a0a;--band:#141416;--fg:#f5f5f7;--fg-2:#86868b;--line:#ffffff1a;--line-2:#ffffff47;--accent:#4dd4c4;--sun:block;--moon:none;--btn-bg:var(--accent);--btn-fg:var(--bg);--focus:var(--accent);--glass-fill:#1c1c2059;--glass-fill-lift:#141416b8;--glass-sheen:#ffffff14;--glass-rim:#ffffff80;--glass-rim-2:#ffffff1a;--glass-edge:#ffffff0f;--glass-inner:#ffffff1f;--glass-depth:#00000073;--glass-spec:#fff3;--glass-shadow:0 1px 2px #00000080, 0 16px 44px -10px #000000a6;--glass-shadow-lift:0 2px 4px #0009, 0 20px 56px -10px #000c;--glass-blur:8px;--glow:14%;--glow-pointer:10%;--tile:#ffffff0b;--sans:"Host Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--max:70rem;--measure:42rem;--gutter:clamp(1.25rem, 5vw, 3rem);--radius-pill:999px;--radius-lg:1.5rem;--header:3.25rem;--header-inset:.75rem;--header-offset:calc(var(--header) + 2 * var(--header-inset));--ease:cubic-bezier(.22, 1, .36, 1)}:root[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#fff;--band:#f5f5f7;--fg:#1d1d1f;--fg-2:#6e6e73;--line:#00000014;--line-2:#00000038;--accent:#0a7c71;--sun:none;--moon:block;--glass-fill:#fff6;--glass-fill-lift:#ffffffb8;--glass-sheen:#ffffff80;--glass-rim:#fffffffa;--glass-rim-2:#fff6;--glass-edge:#0000001a;--glass-inner:#fff9;--glass-depth:#0000001f;--glass-spec:#ffffffd9;--glass-shadow:0 1px 2px #0000000f, 0 14px 36px -10px #0003;--glass-shadow-lift:0 2px 4px #00000012, 0 18px 48px -10px #00000042;--glow:12%;--glow-pointer:8%;--tile:#00000008}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}body{font-family:var(--sans);color:var(--fg);background:var(--bg);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;margin:0;font-size:1.0625rem;line-height:1.5;transition:background-color .3s,color .3s}body:before{content:"";z-index:-1;pointer-events:none;background:radial-gradient(ellipse 60% 70% at 50% -20%, color-mix(in srgb, var(--accent) var(--glow), transparent), transparent 100%);height:60vh;position:fixed;top:0;left:0;right:0}body:after{content:"";z-index:-1;pointer-events:none;background:radial-gradient(28rem circle at var(--px,50%) var(--py,50%), color-mix(in srgb, var(--accent) var(--glow-pointer), transparent), transparent 70%);opacity:0;transition:opacity .6s var(--ease);position:fixed;inset:0}html.pointer body:after{opacity:1}@media (hover:none){body:after{opacity:1;background:radial-gradient(24rem circle at 50% 50%, color-mix(in srgb, var(--accent) var(--glow-pointer), transparent), transparent 70%);animation:40s ease-in-out infinite alternate glow-ride;inset:-50vh -50vw}@supports (animation-timeline:scroll()){body:after{animation:linear both glow-ride;animation-timeline:scroll(root)}}}@keyframes glow-ride{0%{translate:30vw -30vh}to{translate:-30vw 30vh}}img,svg{max-width:100%;display:block}h1,h2,h3,h4{letter-spacing:-.02em;text-wrap:balance;margin:0;font-weight:500;line-height:1.1}p{margin:0}p+p{margin-top:1em}ul,ol{margin:0;padding:0}button{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0;padding:0}:focus-visible{outline:2px solid var(--focus);outline-offset:3px;border-radius:2px}[id]{scroll-margin-top:calc(var(--header-offset) + 1rem)}main{padding-top:var(--header-offset)}.display{letter-spacing:-.03em;font-size:clamp(2.25rem,.75rem + 5vw,4.5rem);font-weight:500;line-height:1.05}.display span{color:var(--fg-2);display:block}.display.brand{color:var(--accent)}.display.brand span{letter-spacing:-.02em;margin-top:.2em;font-size:.6em;line-height:1.15}.h2{letter-spacing:-.02em;font-size:clamp(1.75rem,1rem + 2.5vw,2.5rem)}.h3{letter-spacing:-.01em;font-size:1.25rem}.lede{color:var(--fg-2);max-width:var(--measure);text-wrap:pretty;font-size:clamp(1.0625rem,1.4vw,1.25rem);line-height:1.5}.eyebrow{font-family:var(--mono);color:var(--fg-2);font-size:.8125rem;font-weight:400}.meta{font-family:var(--mono);color:var(--fg-2);font-variant-numeric:tabular-nums;font-size:.8125rem}.muted{color:var(--fg-2)}.prose{max-width:var(--measure);text-wrap:pretty}.prose a,.org a,.figure-note a{text-decoration:underline;-webkit-text-decoration-color:var(--line-2);text-decoration-color:var(--line-2);text-underline-offset:.16em;transition:text-decoration-color .2s}.prose a:hover,.org a:hover,.figure-note a:hover{text-decoration-color:currentColor}.more{margin-top:2rem}a{color:inherit;text-decoration:none}.link{color:var(--accent);font-weight:500;display:inline-block;position:relative}.link:after{content:"";transform-origin:0;height:1px;transition:transform .3s var(--ease);background:currentColor;position:absolute;bottom:-2px;left:0;right:0;transform:scaleX(0)}.link:hover:after{transform:scaleX(1)}.link .arrow{transition:transform .25s var(--ease);margin-left:.15em;display:inline-block}.link:hover .arrow{transform:translate(4px)}.btn{border-radius:var(--radius-pill);background:var(--btn-bg);min-height:2.75rem;color:var(--btn-fg);box-shadow:0 1px 2px #0003, 0 10px 24px -12px color-mix(in srgb, var(--accent) 60%, transparent);transition:background-color .25s, transform .35s var(--ease), box-shadow .35s var(--ease);align-items:center;gap:.4em;padding:.7em 1.3em;font-size:.9375rem;font-weight:500;line-height:1.2;display:inline-flex}.btn:hover{background-color:color-mix(in srgb, var(--btn-bg) 86%, var(--fg));box-shadow:0 2px 4px #0003, 0 14px 32px -12px color-mix(in srgb, var(--accent) 80%, transparent);transform:translateY(-1px)}.btn:active{box-shadow:0 1px 2px #0003, 0 6px 16px -10px color-mix(in srgb, var(--accent) 60%, transparent);transform:scale(.97)}.btn.ghost{color:var(--fg);position:relative}.wrap{max-width:var(--max);padding-inline:max(var(--gutter), env(safe-area-inset-left)) max(var(--gutter), env(safe-area-inset-right));margin-inline:auto}.band{padding-block:clamp(3.5rem,9vw,8rem)}.band.soft{background:color-mix(in srgb, var(--band) 72%, transparent)}.band.tint{background:color-mix(in srgb, var(--accent) 6%, transparent)}.band.rule{border-top:1px solid var(--line)}.band.tight{padding-top:0}.band .h2{margin-bottom:clamp(1.75rem,4vw,3rem)}.actions{flex-wrap:wrap;align-items:center;gap:1rem 2rem;display:flex}.skip{background:var(--fg);color:var(--bg);z-index:40;padding:.5rem 1rem;position:absolute;top:0;left:-999px}.skip:focus{top:.5rem;left:.5rem}.site-header,.btn.ghost,.apps{isolation:isolate;background-color:var(--glass-fill);background-image:linear-gradient(180deg, var(--glass-sheen), transparent 55%);-webkit-backdrop-filter:saturate(170%) blur(var(--glass-blur));backdrop-filter:saturate(170%) blur(var(--glass-blur));box-shadow:0 0 0 1px var(--glass-edge), inset 0 1px 0 var(--glass-rim-2), inset 0 -1px 0 var(--glass-rim-2), inset 0 0 16px -4px var(--glass-inner), inset 0 -12px 20px -14px var(--glass-depth), var(--glass-shadow)}.site-header:before,.btn.ghost:before,.apps:before,.site-header:after,.btn.ghost:after,.apps:after{content:"";z-index:-1;pointer-events:none;border-radius:inherit;position:absolute;inset:0}.site-header:before,.btn.ghost:before,.apps:before{background:linear-gradient(135deg, var(--glass-rim) 0%, var(--glass-rim-2) 30%, var(--glass-rim-2) 70%, var(--glass-rim) 100%);-webkit-mask-composite:xor;padding:1px;-webkit-mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.site-header:after,.btn.ghost:after,.apps:after{background:radial-gradient(8rem circle at var(--mx,50%) var(--my,0%), var(--glass-spec), transparent 60%);opacity:0;transition:opacity .45s var(--ease)}@media (hover:hover){.site-header:hover:after,.btn.ghost:hover:after,.apps:hover:after{opacity:1}}.site-header{top:var(--header-inset);left:env(safe-area-inset-left,0px);right:env(safe-area-inset-right,0px);width:fit-content;max-width:calc(100% - 2 * var(--header-inset));z-index:30;border-radius:var(--radius-pill);transition:box-shadow .4s var(--ease), background-color .4s var(--ease), -webkit-backdrop-filter .4s var(--ease), backdrop-filter .4s var(--ease);margin-inline:auto;position:fixed}.site-header.scrolled{--glass-fill:var(--glass-fill-lift);--glass-blur:18px;--glass-shadow:var(--glass-shadow-lift)}.site-header .wrap{height:var(--header);max-width:none;transition:height .4s var(--ease);align-items:center;gap:.75rem;padding-inline:clamp(.9rem,2.5vw,1.25rem) clamp(.5rem,1.5vw,.625rem);display:flex}.site-header.scrolled .wrap{height:calc(var(--header) - .5rem)}.brand{letter-spacing:-.01em;white-space:nowrap;font-weight:600}.site-tools{align-items:center;gap:clamp(.5rem,1.5vw,.75rem);min-width:0;display:flex}.site-nav{white-space:nowrap;align-items:center;gap:.125rem;font-size:.9375rem;display:flex}.site-nav a{border-radius:var(--radius-pill);color:var(--fg-2);transition:color .25s, background-color .3s var(--ease), box-shadow .3s var(--ease);padding:.4em .8em}.site-nav a:hover{color:var(--fg);background:color-mix(in srgb, var(--fg) 6%, transparent)}.site-nav a[aria-current=page]{color:var(--fg);background:color-mix(in srgb, var(--fg) 9%, transparent);box-shadow:inset 0 1px 0 var(--glass-rim-2), 0 1px 2px #0000000f}.theme{border-radius:var(--radius-pill);width:2.25rem;height:2.25rem;color:var(--fg-2);background:color-mix(in srgb, var(--fg) 4%, transparent);box-shadow:inset 0 0 0 1px var(--line), inset 0 1px 0 var(--glass-rim-2);transition:color .25s, background-color .3s var(--ease), transform .3s var(--ease);flex:none;justify-content:center;align-items:center;display:inline-flex}.theme:hover{color:var(--fg);background:color-mix(in srgb, var(--fg) 10%, transparent)}.theme:active{transform:scale(.92)}.theme svg{width:1.125rem;height:1.125rem}.theme .sun{display:var(--sun)}.theme .moon{display:var(--moon)}@media (max-width:30rem){.brand{font-size:.9375rem}.brand .last{display:none}.site-nav{font-size:.875rem}.site-nav a{padding:.35em .55em}}@media (max-width:22.5rem){.site-header{max-width:calc(100% - 1rem);top:.5rem}.site-header .wrap{gap:.5rem;padding-inline:.75rem .4rem}.site-tools{gap:.35rem}.site-nav{font-size:.8125rem}.site-nav a{padding:.35em .45em}}.site-footer{border-top:1px solid var(--line);color:var(--fg-2);padding-block:2.5rem;font-size:.875rem}.site-footer .wrap{flex-wrap:wrap;justify-content:space-between;gap:1rem 2rem;display:flex}.site-footer nav{flex-wrap:wrap;gap:1.25rem;display:flex}.site-footer a:hover{color:var(--fg)}.hero{padding-block:clamp(5rem,14vw,10rem) clamp(4rem,10vw,7rem)}.hero.small{padding-block:clamp(4rem,10vw,7rem) clamp(3.5rem,8vw,6rem)}.hero .display{max-width:24ch;margin-block:1rem 1.5rem}.hero .lede{margin-bottom:2rem}.hero .wrap>:last-child{margin-bottom:0}.links-list{justify-items:start;gap:.75rem;font-size:1.25rem;display:grid}.icon{width:var(--icon,3.5rem);height:var(--icon,3.5rem);background:var(--band);box-shadow:inset 0 0 0 1px var(--line);object-fit:cover;border-radius:22.5%;flex:none;display:block}.apps{border-radius:var(--radius-lg);flex-wrap:wrap;align-items:center;gap:.75rem;width:fit-content;max-width:100%;margin-top:2.75rem;padding:.85rem 1rem;display:flex;position:relative}.apps a{transition:transform .4s var(--ease);border-radius:22.5%;display:block}.apps .icon{--icon:3rem;box-shadow:inset 0 0 0 1px var(--line), 0 2px 6px #00000014}.apps-note{margin-top:.75rem}.figure{letter-spacing:-.05em;font-variant-numeric:tabular-nums;color:var(--accent);overflow-wrap:anywhere;font-size:clamp(3.25rem,1rem + 11vw,10rem);font-weight:600;line-height:.95}.figure-note{max-width:32rem;color:var(--fg-2);text-wrap:pretty;margin-top:1.25rem;font-size:1.125rem}.entries{border-top:1px solid var(--line)}.row,.entry{--brand:var(--accent);gap:1rem 3rem;padding:2rem 0;display:grid}.entry{border-bottom:1px solid var(--line)}.rows{gap:1rem;display:grid}.row{isolation:isolate;border-radius:var(--radius-lg);background:var(--tile);box-shadow:inset 0 0 0 1px var(--line);padding:clamp(1.25rem,4vw,2.5rem);position:relative}.row:before,.row:after{content:"";z-index:-1;pointer-events:none;border-radius:inherit;opacity:0;transition:opacity .45s var(--ease);position:absolute;inset:0}.row:before{background:radial-gradient(24rem circle at var(--mx,50%) var(--my,50%), color-mix(in srgb, var(--brand) 14%, transparent), transparent 65%)}.row:after{background:radial-gradient(18rem circle at var(--mx,50%) var(--my,50%), color-mix(in srgb, var(--brand) 70%, var(--fg)), transparent 65%);-webkit-mask-composite:xor;padding:1px;-webkit-mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.row .title{align-items:center;gap:1rem;display:flex}.row h3{letter-spacing:-.02em;font-size:1.5rem}.row .headline{color:var(--fg-2);margin:.75rem 0}.row .meta,.entry .meta{line-height:1.6;display:block}.row ul{max-width:var(--measure);gap:.75rem;list-style:none;display:grid}.row .foot{flex-wrap:wrap;align-items:baseline;gap:1.5rem;margin-top:1.25rem;display:flex}.row .foot .link{color:var(--brand)}.entry h3{font-size:1.25rem}.entry .org{color:var(--fg-2);margin:.25rem 0 .5rem}.entry ul{max-width:var(--measure);gap:.5rem;padding-left:1.1rem;display:grid}.entry .note{margin-top:.85rem}@media (min-width:48rem){.row,.entry{grid-template-columns:minmax(0,1fr) minmax(0,2fr)}.entry{padding-block:2.75rem}.row .headline{margin-top:.85rem}}.list2{counter-reset:item;gap:2rem 3rem;display:grid}.list2>div{counter-increment:item}.list2>div:before{content:counter(item, decimal-leading-zero);font-family:var(--mono);color:var(--accent);margin-bottom:.6rem;font-size:.8125rem;display:block}.list2 h3{margin-bottom:.35rem;font-size:1.125rem}.list2 p{color:var(--fg-2)}@media (min-width:48rem){.list2{grid-template-columns:1fr 1fr}}table{border-collapse:collapse;width:100%}th,td{text-align:left;border-bottom:1px solid var(--line);vertical-align:top;padding:.9rem 1rem .9rem 0}th{color:var(--fg-2);font-size:.9375rem;font-weight:500}td.num{font-family:var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:.9375rem}td.note{color:var(--fg-2)}td .app{align-items:center;gap:.75rem;display:inline-flex}td .app .icon{--icon:1.75rem}@media (max-width:40rem){table.play thead{display:none}table.play tr{border-bottom:1px solid var(--line);grid-template-columns:1fr auto;gap:0 1rem;padding-block:.9rem;display:grid}table.play td{border:0;padding:0}table.play td.note{grid-column:1/-1;margin-top:.2rem;font-size:.9375rem}}dl.skills{max-width:var(--measure);gap:1rem;display:grid}dl.skills dt{font-weight:500}dl.skills dd{color:var(--fg-2);margin:0}@media (min-width:40rem){dl.skills{grid-template-columns:11rem 1fr;gap:1rem 1.5rem;max-width:none}}.display .email{letter-spacing:-.03em;overflow-wrap:anywhere;color:var(--accent);font-size:clamp(1.5rem,.5rem + 4.5vw,4rem);line-height:1.1}@media (hover:hover){.row:hover:before,.row:hover:after{opacity:1}.apps a:hover{transform:translateY(-4px)scale(1.06)}}.site-header.lit:after,.btn.ghost.lit:after,.apps.lit:after,.row.lit:before,.row.lit:after,.row.near:before,.row.near:after{opacity:1}.apps a:active{transform:scale(.92)}html.js [data-reveal]{opacity:0;transition:opacity .7s var(--ease), transform .7s var(--ease);transition-delay:calc(var(--i,0) * 70ms);transform:translateY(18px)}html.js [data-reveal].in{opacity:1;transform:none}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}html.js [data-reveal]{opacity:1;transition:none;transform:none}*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}body:after{animation:none;translate:none}}@media (prefers-reduced-transparency:reduce){.site-header,.btn.ghost,.apps{background:var(--bg);-webkit-backdrop-filter:none;backdrop-filter:none}.row{background:var(--band)}}@supports not ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){.site-header,.btn.ghost,.apps{background:var(--band)}.site-header:before,.btn.ghost:before,.apps:before,.site-header:after,.btn.ghost:after,.apps:after,.row:before,.row:after,body:after{display:none}}@media print{@page{margin:18mm}.site-header,.site-footer,.no-print{display:none!important}body{color:#000;background:#fff;font-size:10.5pt}main{padding-top:0}.hero,.hero.small{padding-block:0 1rem}body:before,body:after{display:none}.band,.band.soft,.band.tint{background:0 0;padding-block:1rem}.band .h2{margin-bottom:.75rem}.entry{grid-template-columns:1fr;gap:.25rem;padding-block:.75rem}html.js [data-reveal]{opacity:1;transform:none}a[href^=http]:after{content:" (" attr(href) ")";color:#555;font-size:.85em}}
