*,*::before,*::after{box-sizing:border-box}body,h1,h2,h3,h4,p,figure,blockquote,dl,dd{margin:0}ul[role=list],ol[role=list]{list-style:none}html:focus-within{scroll-behavior:smooth}body{min-height:100vh;text-rendering:optimizeSpeed;line-height:1.5}a:not([class]){text-decoration-skip-ink:auto}img,picture{max-width:100%;display:block}input,button,textarea,select{font:inherit}@media(prefers-reduced-motion:reduce){html:focus-within{scroll-behavior:auto}*,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important}}:root{--color-primary:hsl(93, 87%, 22%);--color-bg:hsl(0, 0%, 100%);--color-text:hsl(0, 0%, 8%);--color-text-muted:hsl(0, 0%, 35%);--color-border:hsl(0, 0%, 8%);--logo-primary:hsl(0, 0%, 8%);--logo-secondary:hsl(0, 0%, 35%);--logo-highlight:hsl(93, 87%, 22%);--width-wide:1200px;--width-narrow:800px;--padding-page:16px}[data-theme=dark]{--color-primary:hsl(93, 87%, 45%);--color-bg:hsl(0, 0%, 8%);--color-text:hsl(0, 0%, 95%);--color-text-muted:hsl(0, 0%, 70%);--color-border:hsl(0, 0%, 30%);--logo-primary:hsl(0, 0%, 95%);--logo-secondary:hsl(0, 0%, 70%);--logo-highlight:hsl(93, 87%, 45%)}@font-face{font-family:martainmono;src:url(/fonts/MartianMono-VariableFont.woff2)format("woff2"),url(/fonts/MartianMono-VariableFont.woff)format("woff");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:robotoflex;src:url(/fonts/RobotoFlex-VariableFont.woff)format("woff");font-weight:400;font-style:normal;font-display:swap}@view-transition{navigation: auto;
}body{font-family:robotoflex,Roboto,sans-serif;font-size:20px;color:var(--color-text);background-color:var(--color-bg);margin:0;padding:var(--padding-page)}a{color:var(--color-primary);text-decoration:underline;text-underline-offset:.2em;text-decoration-thickness:.1em;transition:color .2s ease,text-decoration-thickness .2s ease}a:hover{color:var(--color-text-muted);text-decoration-thickness:.2em}a:focus{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:.25rem}a:focus:not(:focus-visible){outline:none}a:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:.25rem}@media(prefers-reduced-motion:reduce){a{transition:none}}h1{font-family:martainmono,Courier New,monospace;text-transform:uppercase;margin-bottom:2rem}section{padding:2rem 0}p{padding:1rem 0}main{padding:1rem 0}blockquote{padding:0 5rem;color:var(--color-text-muted);font-size:.8rem}pre{background-color:var(--color-bg);padding:1rem;border-radius:.5rem;overflow-x:auto;font-size:.8rem;max-width:100%}code{font-family:martainmono,monospace}.highlight>div{overflow-x:auto}.wide{max-width:var(--width-wide);margin:0 auto;padding:0 2rem}.narrow{max-width:var(--width-narrow);margin:0 auto;padding:0 2rem}.img-right{float:right;max-width:200px;margin:0 0 1rem 1rem}.img-left{float:left;max-width:200px;margin:0 1rem 1rem 0}.main-nav{width:100%;height:auto;display:block;justify-content:center;align-items:center;background-color:transparent;position:relative;z-index:997;pointer-events:none}.logo{flex-shrink:0}.logo svg{width:32px;height:auto;display:block}.logo svg .logo-primary{stroke:var(--logo-primary)}.logo svg .logo-secondary{fill:var(--logo-secondary)}.logo svg .logo-highlight{fill:var(--logo-highlight)}.nav-links{display:flex;justify-content:center;align-items:center;gap:2rem;list-style:none;margin:0;padding:0;height:auto;pointer-events:none}.nav-links a{display:block;text-decoration:none;color:var(--color-text);font-weight:500;padding:.5rem 0;position:relative;transition:color .2s ease;pointer-events:auto}.nav-links a::after{content:"";position:absolute;width:100%;height:2px;bottom:0;left:0;background-color:var(--color-primary);transform:scaleX(0);transform-origin:right;transition:transform .2s ease}.nav-links a:hover::after,.nav-links a[aria-current=page]::after,.nav-links a.current::after{transform:scaleX(1);transform-origin:left}.nav-links a:hover{color:var(--color-text-muted)}.nav-links a:focus{outline:2px solid var(--color-primary);outline-offset:4px;border-radius:.25rem}.nav-links a:focus:not(:focus-visible){outline:none}.nav-links a:focus-visible{outline:2px solid var(--color-primary);outline-offset:4px;border-radius:.25rem}.nav-links a[aria-current=page],.nav-links a.current{color:var(--color-primary);font-weight:600}@media(prefers-reduced-motion:reduce){.nav-links a,.nav-links a::after{transition:none}}#theme-toggle{background:0 0;border:none;padding:.5rem;cursor:pointer;color:var(--color-text);display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;transition:background-color .2s ease;position:relative;z-index:1}#theme-toggle:hover{background-color:var(--color-text-muted)}#theme-toggle svg{width:20px;height:20px;pointer-events:none}#theme-toggle .sun-icon{display:none}#theme-toggle .moon-icon{display:block}[data-theme=dark] #theme-toggle .sun-icon{display:block}[data-theme=dark] #theme-toggle .moon-icon{display:none}#hero{width:100%;padding:2rem 0;display:flex;align-items:center;gap:4rem}.logo-hero{flex:1;max-width:400px}.logo-hero svg{width:100%;height:auto}#hero-content{flex:1}#hero-content h1{font-size:3rem;font-family:martainmono}#hero-content h2{font-size:1.5rem;margin-bottom:1rem;color:var(--color-text-muted)}#hero-content h3{font-size:1.25rem;font-style:italic;color:var(--color-text-muted)}.cards-grid{display:grid;grid-template-columns:repeat(2,minmax(250px,320px));gap:2rem;padding:2rem 0;justify-content:center}.card{background:0 0;border:2px solid var(--color-text);border-radius:.75rem;padding:1.5rem;transition:transform .2s ease}.card:hover{transform:translateY(-2px)}.card-content h3{font-size:1.5rem;margin-bottom:1rem;color:var(--color-text);font-family:martainmono;text-transform:uppercase;position:relative;padding-bottom:.75rem}.card-content h3::after{content:"";position:absolute;bottom:0;left:0;width:3rem;height:2px;background-color:var(--color-primary)}.card-content h3 a{color:var(--color-text);text-decoration:none;transition:color .2s ease}.card-content h3 a:hover{color:var(--color-primary)}.card-content p{color:var(--color-text-muted);line-height:1.5;margin-bottom:1.25rem}.about-content{display:flex;gap:4rem;align-items:center;max-width:800px;margin-left:auto;margin-right:auto}.about-text{flex:1}.about-text p{color:var(--color-text);line-height:1.6}.about-image{flex:0 0 200px}.about-image img{width:100%;height:auto;border-radius:50%;aspect-ratio:1;object-fit:cover}a.read-more{display:inline-block;color:var(--color-primary);text-decoration:none;font-weight:500;transition:color .2s ease}a.read-more::after{content:" →"}a.read-more:hover{color:var(--color-text-muted)}.headshot{width:200px;height:200px;border-radius:50%;overflow:hidden}.fixed-elements{position:fixed;top:0;left:0;right:0;z-index:998;padding:var(--padding-page);display:flex;justify-content:space-between;align-items:center;z-index:500}.logo.nav-logo,.fixed-buttons button{position:relative}.logo.nav-logo::before,.fixed-buttons button::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:48px;height:48px;background-color:var(--color-bg);opacity:.8;border-radius:50%;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:-1}.logo.nav-logo::before{width:56px;height:56px}.fixed-elements::before,.fixed-elements::after{content:"";position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none}.fixed-buttons{display:flex;gap:.5rem;align-items:center}#scroll-top{background:0 0;border:none;padding:.5rem;cursor:pointer;color:var(--color-text);display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;transition:background-color .2s ease}#scroll-top:hover{background-color:var(--color-text-muted)}#scroll-top svg{width:20px;height:20px;pointer-events:none}@media(max-width:1024px){.cards-grid{grid-template-columns:repeat(2,minmax(250px,320px))}}@media(max-width:768px){.cards-grid{grid-template-columns:minmax(250px,320px);padding:1rem;gap:1.5rem}.about-content{flex-direction:column-reverse;gap:2rem}.about-image{flex:none;width:100%;max-width:300px;margin:0 auto}#hero{flex-direction:column;text-align:center;gap:2rem;padding:1rem 0 3rem}.logo-hero{max-width:300px}#hero-content h1{font-size:2.5rem}#hero-content h2{font-size:1.25rem}#hero-content h3{font-size:1.1rem}.nav-logo,#scroll-top,#theme-toggle{display:none}.footer-container{flex-direction:column;gap:2rem}.footer-left{width:100%}.license-footer{max-width:100%;text-align:left}.license-footer svg{margin-left:0;margin-right:.5rem}footer{flex-direction:column;gap:2rem;padding:1.5rem var(--padding-page);margin-top:2rem}.footer-left{width:100%}}#contact-form{max-width:var(--width-narrow);margin:2rem auto;padding:2rem;background-color:var(--color-bg);border-radius:.75rem;border:2px solid var(--color-border)}.form-group{margin-bottom:1.5rem}.form-group label{display:block;margin-bottom:.5rem;font-weight:500;color:var(--color-text)}.form-group input,.form-group select,.form-group textarea{width:100%;padding:.75rem;border:2px solid var(--color-border);border-radius:.5rem;background-color:var(--color-bg);color:var(--color-text);font-family:robotoflex,sans-serif;font-size:1rem;transition:border-color .2s ease,box-shadow .2s ease}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 2px rgba(68,145,7,.1)}.form-group input:hover,.form-group select:hover,.form-group textarea:hover{border-color:var(--color-text-muted)}.form-group textarea{resize:vertical;min-height:120px}#contact-form button{background-color:var(--color-primary);color:var(--color-bg);border:none;border-radius:.5rem;border:none;padding:.75rem 1.5rem;font-size:1rem;font-weight:500;cursor:pointer;transition:background-color .2s ease,transform .2s ease;width:100%}#contact-form button:hover{background-color:var(--color-text-muted);transform:translateY(-1px)}#contact-form button:active{transform:translateY(0)}.form-group label::after{content:" *";color:var(--color-primary)}@media(prefers-reduced-motion:reduce){#contact-form button,.form-group input,.form-group select,.form-group textarea{transition:none}}@media(max-width:768px){#contact-form{padding:1.5rem;margin:1rem auto}.form-group{margin-bottom:1rem}}.nav-toggle{display:none}.nav-toggle-label{display:none;cursor:pointer;padding:1rem;width:64px;height:64px;position:fixed;top:24px;right:24px;z-index:1000;background-color:var(--color-bg);border-width:0;align-items:center;justify-content:center;border-radius:50%}.nav-toggle-label svg{width:32px;height:32px;color:var(--color-text)}.nav-toggle-label .close-icon{display:none}.nav-toggle-label[aria-expanded=true] .burger-icon{display:none}.nav-toggle-label[aria-expanded=true] .close-icon{display:block}@media(max-width:768px){.main-nav{position:fixed;top:0;left:0;width:100%;height:100vh;background-color:var(--color-bg);transform:translateX(100%);transition:transform .3s ease-in-out;z-index:999;pointer-events:auto}.nav-links{height:100%;flex-direction:column;justify-content:center;gap:2rem;margin:0;padding:0;pointer-events:auto}.nav-toggle:checked~.main-nav,.main-nav.nav-open{transform:translateX(0)}.nav-toggle-label{display:flex}.nav-toggle:checked~.nav-toggle-label span:nth-child(1),.nav-open~.nav-toggle-label span:nth-child(1){transform:rotate(45deg)translate(5px,5px)}.nav-toggle:checked~.nav-toggle-label span:nth-child(2),.nav-open~.nav-toggle-label span:nth-child(2){opacity:0}.nav-toggle:checked~.nav-toggle-label span:nth-child(3),.nav-open~.nav-toggle-label span:nth-child(3){transform:rotate(-45deg)translate(7px,-6px)}}.nav-toggle:checked~.main-nav{overflow-y:auto}.nav-toggle:checked~*{overflow:hidden}@media(prefers-reduced-motion:reduce){.main-nav,.nav-toggle-label span{transition:none}}.social-links svg{color:var(--color-text)}.social-links svg *{fill:currentColor}.blog-list{max-width:var(--width-narrow);margin:0 auto;padding:0 2rem}.post-list{margin-top:3rem}.post-summary{margin-bottom:3rem;padding-bottom:2rem;border-bottom:1px solid var(--color-text-muted)}.post-summary:last-child{border-bottom:none}.post-title{margin:0 0 1rem;font-family:martainmono}.post-title a{color:var(--color-text);text-decoration:none;transition:color .2s ease}.post-title a:hover{color:var(--color-primary)}.post-meta{font-size:.9rem;color:var(--color-text-muted);margin-bottom:1rem}.post-summary-content{margin:1rem 0}.read-more{margin-top:1rem}.read-more a{display:inline-block;color:var(--color-primary);text-decoration:none;font-weight:500;transition:color .2s ease}.read-more a:hover{color:var(--color-text-muted)}#blog-callout{width:100%;background-color:var(--color-bg);padding:.5rem 0;text-align:center;border-top:2px solid var(--color-border);border-bottom:2px solid var(--color-border)}#blog-callout .content{max-width:var(--width-narrow);margin:0 auto}#blog-callout p{margin:0;padding:.5rem 0;color:var(--color-text)}@media(max-width:768px){#blog-callout{position:relative;top:0;width:100%;padding:.25rem 4rem;margin-bottom:1rem;border-top:none;border-bottom:none}#blog-callout .content{padding:0 1rem}#blog-callout p{font-size:.9rem;line-height:1.4}#blog-callout .latest-post-date{display:none}.fixed-elements{max-height:0;padding:0}}.skip-link{position:absolute;top:-100px;left:50%;transform:translateX(-50%);background:var(--color-primary);color:var(--color-bg);padding:.5rem 1rem;z-index:1001;transition:top .2s ease;text-decoration:none;border-radius:0 0 .5rem .5rem}.skip-link:focus{top:0;outline:2px solid var(--color-text);outline-offset:2px}@media(prefers-reduced-motion:reduce){.skip-link{transition:none}}footer{border-top:2px solid var(--color-border);padding:2rem var(--padding-page);margin-top:4rem;max-width:var(--width-wide);margin:4rem auto 0;display:flex;justify-content:space-between;align-items:flex-start}.footer-left .logo svg{width:100px;height:100px;aspect-ratio:1}.footer-left{display:flex;align-items:center;gap:1rem}.footer-left p{font-family:martainmono,monospace;margin:0;padding:0;color:var(--color-text);text-transform:uppercase}.footer-social{margin-top:1rem}.footer-social ul{list-style:none;padding:0;margin:0;display:flex;gap:1rem}.footer-social a{display:inline-flex;align-items:center;justify-content:center;padding:.5rem;border-radius:.25rem;transition:background-color .2s ease;position:relative}.footer-social a:focus{outline:2px solid var(--color-primary);outline-offset:2px}.footer-social a:focus:not(:focus-visible){outline:none}.footer-social a:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.footer-social svg{width:24px;height:24px;color:var(--color-text);fill:currentColor}.license-footer{max-width:400px;text-align:right}.license-footer p{font-size:.9rem;color:var(--color-text);margin-bottom:.5rem;line-height:1.5;padding-top:0}.license-footer a{text-decoration:underline;text-underline-offset:.2em}.license-footer a:focus{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:.25rem}.license-footer a:focus:not(:focus-visible){outline:none}.license-footer a:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:.25rem}.license-icons{display:flex;justify-content:flex-end;gap:.5rem}.license-icons svg{width:24px;height:24px;color:var(--color-text);fill:currentColor}@media(max-width:768px){footer{flex-direction:column;gap:2rem;padding:1.5rem var(--padding-page);margin-top:2rem}.footer-left{width:100%}.license-footer{max-width:100%;text-align:left}.license-icons{justify-content:flex-start}.license-footer svg{margin-left:0;margin-right:.5rem}}@media(prefers-reduced-motion:reduce){.footer-social a,.license-footer a{transition:none}}@media(forced-colors:active){.footer-social svg,.license-icons svg{forced-color-adjust:auto}.footer-social a:focus,.license-footer a:focus{outline:2px solid CanvasText}}#main-content-projects h2{font-family:martainmono,monospace;text-transform:uppercase;color:var(--color-primary);margin:3rem 0 2rem;font-size:1.5rem;padding-top:2rem;border-top:1px solid var(--color-border)}#main-content-projects h2:first-of-type{border-top:none;padding-top:0}#main-content-projects h3{font-size:1.5rem;margin:2rem 0 0;color:var(--color-text);font-family:martainmono,monospace;text-transform:uppercase;position:relative;padding:1.5rem 1.5rem .75rem;background:0 0;border:2px solid var(--color-text);border-radius:.75rem .75rem 0 0;border-bottom:none;transition:transform .2s ease}#main-content-projects h3::after{content:"";position:absolute;bottom:0;left:1.5rem;width:3rem;height:2px;background-color:var(--color-primary)}#main-content-projects h3+p,#main-content-projects h3+p+ul{margin:0;padding:1rem 1.5rem;background:0 0;border-left:2px solid var(--color-text);border-right:2px solid var(--color-text)}#main-content-projects h3+p+ul{padding:0 1.5rem}#main-content-projects h3+p+ul{border-bottom:2px solid var(--color-text);border-radius:0 0 .75rem .75rem;padding-bottom:1.5rem;list-style:none}#main-content-projects h3+p+ul li{color:var(--color-text-muted);line-height:1.5;margin-bottom:1rem;padding:0}#main-content-projects h3+p+ul li:last-child{margin-bottom:0}#main-content-projects img{width:100%;height:auto;border-radius:.25rem;border:1px solid var(--color-border)}#main-content-projects li strong{color:var(--color-primary);font-weight:600}@media(max-width:768px){#main-content-projects h2{margin:2rem 0 1rem;padding-top:1rem}#main-content-projects h3{padding:1.25rem 1.25rem .75rem}#main-content-projects h3::after{left:1.25rem}#main-content-projects h3+p,#main-content-projects h3+p+ul{padding:0 1.25rem}#main-content-projects h3+p+ul{padding-bottom:1.25rem}}@media(prefers-reduced-motion:reduce){#main-content-projects h3,#main-content-projects h3+p,#main-content-projects h3+p+ul{transition:none;transform:none}#main-content-projects a[href*="github.com"]{transition:none}}*,*::before,*::after{box-sizing:border-box}body,h1,h2,h3,h4,p,figure,blockquote,dl,dd{margin:0}ul[role=list],ol[role=list]{list-style:none}html:focus-within{scroll-behavior:smooth}body{min-height:100vh;text-rendering:optimizeSpeed;line-height:1.5}a:not([class]){text-decoration-skip-ink:auto}img,picture{max-width:100%;display:block}input,button,textarea,select{font:inherit}@media(prefers-reduced-motion:reduce){html:focus-within{scroll-behavior:auto}*,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important}}