@layer base{:root{font-family:Poppins,sans-serif;letter-spacing:0;line-height:1.8;--step--2:clamp(0.6076rem, 0.4909rem + 0.2335vw, 0.72rem);--step--1:clamp(0.7292rem, 0.5517rem + 0.355vw, 0.9rem);--step-0:clamp(0.875rem, 0.6153rem + 0.5195vw, 1.125rem);--step-1:clamp(1.05rem, 0.6799rem + 0.7403vw, 1.4063rem);--step-2:clamp(1.26rem, 0.7428rem + 1.0344vw, 1.7578rem);--step-3:clamp(1.512rem, 0.8rem + 1.4239vw, 2.1973rem);--step-4:clamp(1.8144rem, 0.8459rem + 1.937vw, 2.7466rem);--step-5:clamp(2.1773rem, 0.8724rem + 2.6098vw, 3.4332rem);--step-6:clamp(2.6127rem, 0.8685rem + 3.4884vw, 4.2915rem);--xxxs:clamp(0.25rem, 0.1851rem + 0.1299vw, 0.3125rem);--xxs:clamp(0.4375rem, 0.3076rem + 0.2597vw, 0.5625rem);--xs:clamp(0.6875rem, 0.4927rem + 0.3896vw, 0.875rem);--sm:clamp(0.875rem, 0.6153rem + 0.5195vw, 1.125rem);--md:clamp(1.3125rem, 0.9229rem + 0.7792vw, 1.6875rem);--lg:clamp(1.75rem, 1.2305rem + 1.039vw, 2.25rem);--xl:clamp(2.625rem, 1.8458rem + 1.5584vw, 3.375rem);--xxl:clamp(3.5rem, 2.461rem + 2.0779vw, 4.5rem);--xxxl:clamp(5.25rem, 3.6916rem + 3.1169vw, 6.75rem);--xxxxl:clamp(5.25rem, 3.6916rem + 3.1169vw, 6.75rem);--flex-50:1 1 22.75em;--flex-33:1 1 13.33em;--flex-66:2 1 26.66em;--flex-25:1 1 13.33em;--flex-75:3 1 39.99em;--flex-desktop:768px;--lightest:256,256,256;--light:244,243,238;--midAccent:42,106,72;--darkAccent:38,87,175;--paleAccent:165,203,175;--dark:22,42,43;--darkest:18,18,12;--copyColor:rgb(var(--darkest));--backgroundColor:rgb(var(--light));--cardBackground:rgba(var(--lightest), .75);--cardBackground:#FCFCFB;--surfaceColor:rgba(var(--darkest), .25);--border1:rgba(var(--darkest), .25);--border2:rgba(var(--darkest), .45);--tagBg:rgba(var(--midAccent), .15);--tagBg:#D8DFD6;--tagBgAccent:rgba(var(--midAccent), .20);--tagText:var(--copyColor);--linkColor:rgb(var(--midAccent));--accentColor:var(--surfaceColor);--borderRadiusSm:4px;--borderRadiusMd:8px;color:var(--copyColor);background-color:var(--backgroundColor)}[data-theme=dark] body{--copyColor:rgb(var(--light));--backgroundColor:rgb(var(--darkest));--cardBackground:rgba(var(--lightest), .045);--cardBackground:#1C1C16;--surfaceColor:rgba(var(--light), .4);--tagBg:rgba(var(--midAccent), .33);--tagBg:#1B2F1F;--tagBgAccent:rgba(var(--midAccent), .33);--tagText:rgb(var(--light));--linkColor:rgb(var(--paleAccent))}h1{font-size:var(--step-6);max-width:1330px;text-wrap:balance;line-height:1;letter-spacing:-.175rem}h1,h2,h3,h4,h5,ol,p,ul{color:var(--copyColor)}h1,h2{font-family:Fraunces,serif;font-weight:400;margin-bottom:var(--sm)}h1 code{font-size:.8em;line-height:1}.subhead code,p code{font-size:.95em;text-align:left;line-height:1}.size-2,h2{font-size:var(--step-4);letter-spacing:-.125rem;line-height:.8}.stats--desc,.tags,figcaption,h6,ol,p,ul{font-size:var(--step-0);line-height:1.75;font-weight:400}h3{font-weight:600}p{max-width:995px;margin-bottom:var(--lg)}.subhead,.tile-grid a,blockquote p,h3{font-size:var(--step-1);max-width:1000px;font-weight:600;line-height:1.66}.subhead{font-weight:400}h3,section .tile-grid a{margin-bottom:var(--xs)}.fine-print{font-size:var(--step--1)}b{font-weight:600}a{font-weight:600;text-decoration:none;color:var(--copyColor);transition:color 250ms ease-in}a:hover,ol a,p a{-webkit-text-decoration-line:underline;-webkit-text-decoration-style:wavy;text-decoration-line:underline;text-decoration-style:wavy;text-decoration-color:var(--linkColor);text-decoration-thickness:1px;text-underline-offset:4px;text-decoration-skip-ink:none}a:active,a:hover{color:var(--linkColor)}.mono,code,pre{font-family:"Space Mono",monospace}code{display:inline;font-family:"Space Mono",monospace;background:var(--tagBg);color:var(--tagText);padding:.15em var(--xxs);border-radius:var(--borderRadiusSm)}.balance{display:inline-block;text-wrap:balance}.text-align-right{text-align:right;margin-left:auto}h2{position:relative;padding-bottom:var(--sm);margin-bottom:var(--lg)}h2:after{content:"";display:block;height:2px;background:var(--surfaceColor);width:100%;position:absolute;bottom:0;left:0}@media screen and (min-width:800px){h2.text-align-center{padding-bottom:0}h2.text-align-center:after{display:none}.text-align-center{display:block;text-align:center;margin-left:auto;margin-right:auto}}footer,header,section{padding:var(--xxl) var(--md);background:var(--backgroundColor)}@media screen and (min-width:850px){footer,header,section{padding:var(--xxxxl) var(--md)}}.container{max-width:1500px;margin:0 auto;width:100%}section{scroll-margin-top:var(--xxl)}}@layer atoms{.skip-to-main:focus{left:50%;transform:translateX(-50%);opacity:1}.skip-to-main:focus+.navbar{margin-top:var(--xl)}.tags li,.tags>span{display:inline-block;background:var(--tagBg);color:var(--tagText);padding:.15em var(--xxs);border-radius:var(--borderRadiusSm)}.link-list a,a.arrow-link{text-decoration:none}.arrow-link--icon{width:1.25em;height:1em;overflow:hidden;vertical-align:middle;margin-left:0;display:inline-block;position:relative}.arrow-link--icon svg,.arrow-link--icon>*{display:inline-block;transition:250ms margin ease-out}.arrow-link--icon svg{height:1em;width:1em;position:absolute;left:0;top:0;margin-left:0;transform:rotate(180deg);transition:250ms margin ease-out}.arrow-link--icon .start{opacity:0}.arrow-link--icon .active{opacity:1}@media screen and (min-width:800px){.arrow-link--icon{margin-left:-3px}.arrow-link--icon .start{opacity:1;margin-left:0}.arrow-link--icon .active{opacity:0;margin-left:0}a:hover .arrow-link--icon .start{opacity:0}a:hover .arrow-link--icon svg{margin-left:2px}a:hover .arrow-link--icon .active{opacity:1}}.link-list a:hover,a.arrow-link:hover{color:var(--copyColor)}.button{padding:var(--xxs) var(--xs);border:2px solid var(--copyColor);text-decoration:none;border-radius:var(--borderRadiusSm);transition:background-color 250ms ease-in,border-color 250ms ease-in;cursor:pointer}.button.primary{display:inline-block;background:var(--copyColor);color:var(--backgroundColor)}.button.primary:active,.button.primary:focus,.button.primary:hover{background:var(--linkColor);border:2px solid var(--linkColor);text-decoration:none}.button.alternate{display:inline-block;background:0 0;color:var(--copyColor);border:2px solid var(--copyColor)}.button.alternate:active,.button.alternate:focus,.button.alternate:hover{background:var(--tagBg);text-decoration:none}}@layer molecules{.button-section{display:flex;width:100%;text-align:center;border:2px solid var(--copyColor);border-radius:var(--borderRadiusSm);margin-bottom:0}.button-section.mobile-only{margin:var(--lg) 0 var(--xl) 0}.button-section .button,.button-section .button:hover{border:unset;flex:1 0 auto;border-radius:unset}.button-section .button:first-child{border-right:2px solid var(--copyColor)}@media screen and (min-width:600px){.button-section{width:fit-content}.button-section .button{flex:auto}}.tags{display:flex;flex-wrap:wrap;margin-top:auto;gap:var(--xxs);font-family:"Space Mono",monospace;padding-right:var(--lg)}.section-cta{display:block;width:100%;max-width:unset;margin-top:var(--xl)}.section-cta:has(.right-align){text-align:right}.section-cta a{display:inline-block}}@layer organisms{.tile-grid{display:grid;list-style:none;grid-template-columns:1fr;gap:var(--md)}.tile-grid>*{height:100%;display:flex;flex-direction:column;position:relative}.tile-grid li:has(a){cursor:pointer}.tile--image{background:var(--backgroundColor);border-radius:var(--borderRadiusMd);overflow:hidden}.tile--image img{width:100%;height:auto;transition:all 250ms ease-in;object-fit:cover;object-position:center top;height:100%}.tile-content{padding:var(--sm) 0 var(--sm) 0}.tile-content a{text-decoration:none;width:fit-content;color:var(--copyColor);margin-bottom:var(--xs)}.tile-content svg{transform:rotate(180deg);display:inline-block;vertical-align:middle;margin-left:0;height:1em;width:1em}.tile-content .tags{margin-top:var(--xs)}@media screen and (min-width:820px){.tile-grid{gap:var(--xs)}.tile-content .tags{margin-top:auto}.tile-grid>li{overflow:hidden;border-radius:var(--borderRadiusMd);background:var(--cardBackground)}.tile-content{position:absolute;height:100%;width:100%;padding:var(--md);bottom:0;border-radius:var(--borderRadiusMd);overflow:clip;display:flex;flex-direction:column;flex:1;opacity:0;transition:opacity 250ms ease-in;z-index:1}.tile-content>*{z-index:1}.tile-content a{transition:padding-top 250ms ease-out,opacity 150ms ease-out;padding-top:var(--sm);opacity:.5}.tile-content:before{transition:opacity 250ms ease-in;width:102%;height:102%;position:absolute;content:"";background:var(--cardBackground);opacity:.97;top:-1%;left:-1%}.tile--image{display:block;border-radius:0;top:0;height:100%;width:100%;overflow:clip;border:1px solid var(--cardBackground);transition:opacity 250ms ease-out}.tile-grid li:focus-within .tile-content,.tile-grid li:hover .tile-content{opacity:1;height:100%}.tile-grid li:focus-within .tile-content a,.tile-grid li:hover .tile-content a{padding-top:0;opacity:1}.tile-grid li:focus-within .tile--image,.tile-grid li:hover .tile--image{opacity:.75}}@media screen and (min-width:820px){.tile-grid{grid-template-columns:repeat(auto-fit,minmax(39%,1fr));gap:var(--xs)}}@media screen and (min-width:1365px){.tile-grid{grid-template-columns:repeat(auto-fit,minmax(30%,1fr))}}.two-up{display:flex;flex-direction:column;gap:var(--md) var(--xxl);flex-wrap:wrap}.two-up.wrap-reverse{flex-direction:column-reverse;flex-wrap:wrap-reverse}.two-up .sticky{position:sticky;top:calc(var(--xxl) + var(--xxl));height:fit-content}@media screen and (min-width:1010px){.two-up,.two-up.wrap-reverse{flex-direction:row}.flex--25{flex:var(--flex-25)}.flex--50{flex:var(--flex-50)}.flex--33{flex:var(--flex-33)}.flex--66{flex:var(--flex-66)}}.accent,section.accent{background:var(--cardBackground);padding-top:var(--xxxl);padding-bottom:var(--xxxl)}.accent section{background:0 0}section.wave{padding-bottom:var(--xxxxl);padding-top:var(--xxxxl)}.wave{--mask:radial-gradient(78.1px at 50% 110px, #000 99%, #0000 101%) calc(50% - 100px) 0/200px 51% repeat-x,radial-gradient(78.1px at 50% -60px, #0000 99%, #000 101%) 50% 50px/200px calc(51% - 50px) repeat-x,radial-gradient(78.1px at 50% calc(100% - 110px), #000 99%, #0000 101%) calc(50% - 100px) 100%/200px 51% repeat-x,radial-gradient(78.1px at 50% calc(100% + 60px), #0000 99%, #000 101%) 50% calc(100% - 50px)/200px calc(51% - 50px) repeat-x;-webkit-mask:var(--mask);mask:var(--mask)}.accent .tags>*,.accent code{background:var(--tagBgAccent)}}@layer sections{.projects-section .tile-grid{margin-bottom:var(--xl)}nav.navbar{padding:var(--xxxs) var(--md);position:relative;z-index:99;position:fixed;top:0;width:100%;background:var(--backgroundColor)}.navbar--contents{display:flex;flex-direction:row}.navbar--toggle{display:block;background:0 0;border:unset;padding:0;height:44px;width:44px;text-align:right;padding-top:4px;margin-right:-4px;margin-left:-4px}.hamburger{transform:scale(.75)}.navbar--icon{height:14px;width:14px}.navbar .icon-link svg{width:28px;height:28px}.navbar li{display:flex;align-items:center}.navbar a{min-height:45px;display:flex;align-items:center;margin:0 var(--sm)}.navbar a.button{margin:0}.navbar--home a{margin:0}.navbar--level-2{display:none;width:100%}.navbar--level-1{position:relative}.navbar--level-2.js-open{display:inline-flex}.theme-toggle{color:var(--copyColor);background-color:var(--backgroundColor);padding:var(--xxs)}.theme-toggle--container{opacity:0;animation:delay-viz 150ms ease-out forwards;animation-delay:250ms}@keyframes delay-viz{from{opacity:0}to{opacity:1}}.theme-toggle svg{width:24px;height:24px}body.js-nav-open{overflow:hidden}.js-nav-open footer,.js-nav-open header,.js-nav-open section{filter:blur(4px)}@media (prefers-reduced-motion:no-preference){.navbar--level-2.navbar--contents{transform:translate(33vw,0)}.navbar--level-2.navbar--contents.js-open{animation:slide-left 250ms ease-out forwards}}.navbar--level-2{position:fixed;flex-direction:column;top:calc(var(--xxxs) + var(--xxxs) + 44px);left:0;width:100%;height:calc(100vh - var(--xl));max-width:100vw;background:var(--cardBackground);z-index:99;padding:var(--sm) var(--md) calc(var(--xxxl) + var(--xxl)) var(--md)}.navbar--level-2 li{width:100%}.navbar--level-2 li a{width:100%;padding:var(--md) 0;margin:0}.navbar--level-2 li a.button{text-align:center;justify-content:center;padding:var(--xs)}.navbar .desktop,.navbar li.desktop{display:none}.navbar--level-2 li.contact{margin-top:auto}.navbar .contact ul{display:flex;flex-direction:row;flex-wrap:nowrap;width:fit-content;margin:0 auto;gap:var(--md)}@media screen and (min-width:800px){body.js-nav-open{overflow:unset}.js-nav-open footer,.js-nav-open header,.js-nav-open section{filter:unset}.navbar--level-2.navbar--contents{transform:none}.navbar--level-2.navbar--contents.js-open{animation:none}.navbar--level-2{display:flex;position:static;flex-direction:row;top:initial;left:initial;max-width:unset;background:0 0;padding:0;height:auto}.navbar--level-2 li{width:auto}.navbar--level-2 li a{width:100%;padding:0;margin:0 var(--sm)}.navbar--level-2 li a.button{text-align:center;justify-content:center;padding:var(--xxs) var(--xs)}.navbar .desktop,.navbar li.desktop{display:block}nav.navbar{padding:var(--xxs) var(--md)}.navbar--links{width:100%}.navbar .mobile,.navbar li.mobile{display:none}.theme-toggle{margin-right:var(--xs)}.theme-toggle svg{width:28px;height:28px}}@keyframes slide-left{from{transform:translate(33vw,0)}to{transform:translate(0,0)}}footer .copyright a{font-weight:400}footer a{text-decoration:none}footer .icon-link:hover{color:var(--copyColor)}footer a.button{font-weight:600}footer ul{display:flex;flex-direction:row;width:100%;gap:var(--md);padding-bottom:var(--xl);flex-wrap:wrap}@media screen and (max-width:690px){footer .github span,footer .linkedin span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}footer ul .email+li{flex:1 0}}footer p{margin-bottom:var(--xxs)}footer .subhead{font-weight:600;margin-bottom:var(--md)}footer h2{margin-bottom:var(--lg)}footer .copyright{margin-top:auto;opacity:.75}footer .container{padding:var(--xxxl) 0 0 0;display:flex;flex-direction:column;flex-wrap:wrap;gap:var(--xl) 0}footer .icon-link{display:flex;flex-direction:row;gap:var(--xxxs);align-items:center}footer .icon-link svg{flex:0 0 26px;width:26px;height:26px}footer .resume svg{flex:0 0 28px;width:28px;height:28px}footer .icon-link span{flex:1 0 auto}footer .email{flex:1 0 100%}footer .email a{width:100%;text-align:center}footer .about{flex:1 0 100%}@media screen and (min-width:690px){footer ul{width:fit-content}footer li{flex:1 1 10ch}footer li{flex:unset}footer ul{justify-content:flex-start}footer .email a{min-width:25ch;width:fit-content}footer .copyright{text-align:right;margin-left:auto}}}@layer utilties{.visually-hidden:not(:focus):not(:active){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.display-none{display:none}@media screen and (max-width:699.99px){.no-mobile{display:none}}@media screen and (min-width:700px){.mobile-only{display:none}}@media screen and (max-width:700px){.sr-mobile{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}}}@layer animations{@media (prefers-reduced-motion:no-preference){.js-animate{opacity:0;transition:opacity 1s cubic-bezier(.4, 0, .2, 1),translate 1s cubic-bezier(.4, 0, .2, 1);translate:0 10px}.js-animate.js-fade-in{opacity:1;translate:unset}}@media screen and (min-width:800px){a.animate-wavy{text-decoration:none;position:relative;overflow:hidden;display:inline-flex;white-space:nowrap;color:var(--copyColor)}a.animate-wavy:hover:after{position:absolute;opacity:0;transition:opacity 250ms ease-in;top:8px;left:0;right:0;bottom:0;white-space:nowrap;content:attr(data-animation) attr(data-animation);color:transparent;line-height:1.8;font-weight:600;-webkit-text-decoration-line:underline;-webkit-text-decoration-style:wavy;text-decoration-line:underline;text-decoration-style:wavy;text-decoration-color:var(--linkColor);text-decoration-thickness:1px;text-underline-offset:4px;text-decoration-skip-ink:none}a.animate-wavy:hover{text-decoration:none;color:var(--copyColor)}a.animate-wavy:hover:after{opacity:1;animation:wavy-slide 3s linear infinite}}@keyframes wavy-slide{to{margin-left:-35px}}}