@font-face{font-family:public-pixel;src:url(/fonts/public-pixel.woff);font-display:swap}@font-face{font-family:chill;src:url(/fonts/chill.woff);font-display:swap}@font-face{font-family:chill;src:url(/fonts/public-pixel.woff);unicode-range:U+00C0-00D6,U+00D8-00F6,U+00F8-00FF,U+0152-0153,U+0178;size-adjust:80%;font-display:swap}:root{--paper: #f6d4b1;--ink: #525252;--amber: #f99021;--ember: #c33a0c;--crt: #0d0b09;--shadow: rgba(82, 82, 82, .25);--shadow-strong: rgba(82, 82, 82, .4);--paper-glow: rgba(246, 212, 177, .7);--amber-glow: rgba(249, 144, 33, .55);--font-pixel: "public-pixel", monospace;--font-body: "chill", sans-serif;--measure: 680px;--window-width: 960px;--ease-out: cubic-bezier(.2, .9, .25, 1);--color: var(--ink)}*{margin:0;padding:0}html,body{overflow-x:hidden;background-color:var(--paper);font-family:var(--font-body);font-size:18px;-webkit-text-size-adjust:100%}@media (prefers-reduced-motion: no-preference){html{scroll-behavior:smooth}}.webgl{position:fixed;top:0;left:0;right:0;bottom:0;width:100%;outline:none;z-index:1;touch-action:manipulation}.webgl:active{cursor:grabbing}#hero-backup{display:flex;flex-direction:column;justify-content:center;gap:16px;position:absolute;top:0;left:0;right:0;bottom:0;width:clamp(0px,95vw,580px);margin:auto;color:var(--ink);outline:none;z-index:0}#hero-backup p{width:auto;margin:0;padding:0}#hero-backup .hero-kicker{font-family:var(--font-pixel);font-size:1.2em;padding-top:4px;padding-bottom:8px}#hero-backup .hero-name{margin:0;text-align:left}#hero-backup .hero-role{margin-left:32px}#hero-backup .hero-role:before{content:"• "}#textarea{position:fixed;top:0;right:0;outline:none;z-index:-1;opacity:0}h1,.title-xl{display:inline-block;color:var(--paper);background-color:var(--ink);font-family:var(--font-pixel);font-size:2em;padding:4px 16px 8px;margin:0 auto .3em}.title-block{display:inline-block;font-size:1.2em;text-align:center;color:var(--paper);background-color:var(--ink);font-family:var(--font-pixel);padding:4px 16px 8px;margin:.3em auto}h3,.title-pixel{font-size:1.2em;text-align:center;color:var(--ink);font-family:var(--font-pixel);padding-top:4px;padding-bottom:8px;margin:.3em auto}hr{width:100px;height:2px;background-color:none;margin:40px auto;border:none;border-bottom:dashed 2px var(--ink)}.skills,p{padding:16px;text-align:left;line-height:1.5;width:clamp(0px,95vw,var(--measure));margin:auto;box-sizing:border-box}.skills{display:flex;flex-wrap:wrap;align-content:center;justify-content:center;align-items:center;gap:16px;text-align:center;list-style-type:none;transition:all .3s}.skills li{display:inline-block;padding:4px 8px;border:dashed 1px var(--ink);box-shadow:1px 1px 0 var(--paper),4px 4px 0 var(--shadow)}main{color:var(--ink);margin-top:200vh;text-align:center;position:relative;z-index:2}section{padding-bottom:64px;margin-bottom:80px;position:relative}section:after{content:"";border-bottom:dashed 2px var(--ink);position:absolute;bottom:0;transform:translate(-50%);width:clamp(0px,95vw,var(--measure))}section:last-of-type{border-bottom:none;margin-bottom:0}footer{display:flex;gap:32px;flex-direction:column;font-size:12px;width:clamp(0px,95vw,var(--measure));margin:auto;padding:32px 0;text-align:center;color:var(--ink);z-index:2;position:relative}a{display:inline-block;color:inherit;text-decoration-style:solid;text-decoration-thickness:2px;transition:all .3s}a:hover{transform:scale(1.1);box-shadow:1px 1px 0 var(--paper),4px 4px 0 var(--shadow)}a:active{transform:scale(1);box-shadow:1px 1px 0 var(--paper),3px 3px 0 var(--shadow-strong)}.btn{position:relative;font-family:var(--font-body);font-size:18px;display:inline-flex;gap:.25rem;box-shadow:6px 6px 0 var(--shadow);background-color:var(--ink);color:var(--paper);cursor:pointer;transition:all .3s;padding:4px 24px;border:var(--paper) solid 1px;text-decoration:none}.btn:hover{transform:scale(1.1);box-shadow:8px 8px 6px var(--shadow);z-index:2}.btn:active{transform:scale(.95);box-shadow:4px 4px 0 var(--shadow-strong)}:focus-visible{outline:2px dashed var(--amber);outline-offset:3px}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.contact__lead{text-align:center}.contact__links{display:flex;flex-wrap:wrap;justify-content:center;gap:16px 20px;list-style:none;margin-top:8px}nav{position:fixed;top:0;left:0;background-color:#faebd7;width:0px;z-index:5}.menu-btn{position:fixed;padding:20px;top:0;left:0;right:0;display:flex;gap:0px;transition:all .7s;z-index:1;justify-content:space-between;pointer-events:none}nav .btn{opacity:0;pointer-events:none;padding:8px 16px;fill:var(--paper)}.menu-btn>.btn:first-child{padding:8px 24px;margin-right:16px}nav svg{transition:all .2s}html[data-scroll=true] nav .btn{opacity:1;pointer-events:all}.active .btn{box-shadow:6px 6px 0 var(--paper-glow);background-color:var(--paper);color:var(--ink);fill:var(--ink);border-color:var(--ink);opacity:1!important;pointer-events:all!important}.active .btn:hover{box-shadow:8px 8px 6px #f6d4b180}.active .btn:active{box-shadow:4px 4px 0 var(--paper-glow)}.menu-body{background-color:var(--ink);color:var(--paper);font-size:2em;font-family:var(--font-pixel);text-decoration:none!important;position:fixed;top:0;bottom:0;left:-100px;right:100vw;z-index:0;transition:all .7s;display:inline-flex;gap:16px;flex-direction:column;padding-top:70px;padding-left:20px;overflow:hidden;box-sizing:border-box;opacity:0}.menu-body a{text-decoration:none!important}.menu-body a:hover{transform:none}.active .menu-body{left:0;right:0;opacity:1}.nav-prompt{align-self:center;margin-left:16px;padding:7px 12px;font-family:var(--font-pixel);font-size:11px;white-space:nowrap;color:var(--amber);background-color:var(--crt);border:var(--paper) solid 1px;box-shadow:6px 6px 0 var(--shadow);text-shadow:0 0 6px var(--amber-glow);opacity:0;transition:opacity .3s}.nav-prompt:after{content:"";display:inline-block;width:.6em;height:1em;margin-left:4px;vertical-align:-.15em;background-color:currentColor;animation:caret-blink 1s steps(1) infinite}html[data-scroll=true] .nav-prompt{opacity:1}.active .nav-prompt{opacity:0!important}#tip-scroll{position:fixed;bottom:16px;left:50%;transform:translate(-50%);font-family:var(--font-body);font-size:14px;box-shadow:6px 6px #000000bf;background-color:var(--ink);color:var(--paper);transition:all .3s;padding:4px 24px;border:var(--paper) solid 1px;pointer-events:none;display:none;opacity:1}html[data-scroll=true] #tip-scroll{opacity:0}.active #tip-scroll{opacity:0!important}.nav-label{white-space:nowrap}@media (max-width: 539px){.nav-prompt{display:none}}@media (max-width: 479px){.nav-label{display:none}}@media (min-width: 540px){.menu-btn{justify-content:left}.active .menu-btn{translate:28px}.menu-body{padding-left:50px}}@media (orientation: portrait){#tip-scroll{display:block}}#loading{position:fixed;top:0;right:0;bottom:0;left:0;z-index:6;display:flex;flex-direction:column;justify-content:center;gap:24px;padding:10vw;color:var(--paper);background-color:var(--ink);transform-origin:center}#boot-log{display:flex;flex-direction:column;justify-content:flex-end;height:21em;overflow:hidden;font-family:var(--font-pixel);font-size:clamp(9px,1.3vw,14px);line-height:1.75;text-align:left}.boot-line{flex-shrink:0;white-space:pre-wrap;word-break:break-all}.boot-line--title{font-size:1.6em;line-height:1.3;margin-bottom:.5em}#boot-log:after{content:"";display:block;flex-shrink:0;width:.6em;height:1.1em;margin-top:2px;background-color:currentColor;animation:caret-blink 1s steps(1) infinite}#loading-bar{position:relative;width:100%;height:48px;border:dashed 2px var(--paper);box-shadow:2px 2px 0 var(--ink),6px 6px 0 var(--paper-glow)}#loading-bar-progress{position:absolute;top:2px;bottom:2px;left:2px;right:2px;background-color:var(--paper);transform:scaleX(0);transform-origin:left;transition:transform .2s steps(4,end)}#loading.is-exiting{pointer-events:none;animation:crt-off .55s cubic-bezier(.7,0,.3,1) forwards}@keyframes crt-off{0%{transform:scale(1);filter:brightness(1)}55%{transform:scaleY(.004);filter:brightness(3)}to{transform:scale(0,.004);filter:brightness(5);opacity:.2}}#projects-container{width:min(95vw,var(--window-width));margin:24px auto 0}.filters{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin:0 auto 56px}.filter{font-family:var(--font-pixel);font-size:11px;line-height:1;padding:10px 12px;color:var(--ink);background-color:var(--paper);border:1px dashed var(--ink);box-shadow:3px 3px 0 var(--shadow);cursor:pointer;transition:transform .15s,box-shadow .15s,background-color .15s,color .15s}.filter__count{margin-left:8px}.filter__count:before{content:"["}.filter__count:after{content:"]"}.filter:hover{transform:translate(-2px,-2px);box-shadow:5px 5px 0 var(--shadow)}.filter:active{transform:translate(1px,1px);box-shadow:1px 1px 0 var(--shadow)}.filter[aria-pressed=true]{color:var(--paper);background-color:var(--ink);border-style:solid}.windows{display:flex;flex-direction:column;gap:72px}.windows--compact{display:grid;grid-template-columns:minmax(0,1fr);gap:40px}@media (min-width: 820px){.windows--compact{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start}}.more-projects{margin:96px auto 40px}.more-projects[hidden],.window[hidden]{display:none!important}.window{--lift: 0px;position:relative;text-align:left;background-color:var(--paper);border:2px dashed var(--ink);box-shadow:8px 8px 0 var(--shadow);transform:perspective(1400px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg)) translate(var(--lift),var(--lift));transition:transform .3s var(--ease-out),box-shadow .3s var(--ease-out)}.window:hover{--lift: -4px;box-shadow:14px 14px 0 var(--shadow)}.window__bar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:8px 12px;font-family:var(--font-pixel);font-size:11px;color:var(--paper);background-color:var(--ink)}.window__path{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.window__controls{display:flex;flex-shrink:0;gap:6px}.window__controls i{display:block;width:10px;height:10px;background-color:var(--paper)}.window__controls i:last-child{background-color:var(--amber)}.window__body{padding:28px clamp(16px,4vw,40px) 32px}.window__header{text-align:center}.window__title{max-width:100%;box-sizing:border-box;font-size:clamp(.8em,4.4vw,1.2em);overflow-wrap:anywhere}.window--compact .window__title{font-size:clamp(.8em,4.4vw,.95em)}.window .window__period{width:auto;padding:0;margin-top:12px;text-align:center;font-family:var(--font-pixel);font-size:.72em}.window .window__meta{width:auto;padding:0;margin-top:8px;text-align:center;font-size:.85em;opacity:.85}.window .skills{width:auto;padding:20px 0;gap:10px}.window .skills li{font-size:.85em}.window__text{max-width:var(--measure);margin:0 auto}.window__text p,.window .window__summary{width:auto;padding:0;margin:0 0 1em}.window__more{margin-top:4px}.window__more summary{cursor:pointer;list-style:none;text-align:center;font-family:var(--font-pixel);font-size:11px}.window__more summary::-webkit-details-marker{display:none}.window__more summary:before{content:"+ "}.window__more[open] summary:before{content:"- "}.window__more[open] summary{margin-bottom:16px}.shots{display:grid;gap:20px;margin:28px 0 8px}@media (min-width: 820px){.shots--2{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start}}.shot{margin:0}.shot__button{position:relative;display:block;width:100%;padding:0;overflow:hidden;border:1px solid var(--ink);background-color:var(--crt);box-shadow:4px 4px 0 var(--shadow);cursor:zoom-in}.shot__button img{display:block;width:100%;height:auto;transition:transform .4s var(--ease-out)}.shot__button:hover img{transform:scale(1.03)}.shot__button:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:repeating-linear-gradient(to bottom,rgba(13,11,9,.35) 0 2px,transparent 2px 4px);opacity:0}.shot--logo{max-width:220px;margin:0 auto}.shot--logo img{display:block;width:100%;height:auto}.ascii-screen{position:relative;max-width:var(--measure);margin:28px auto 8px;padding:24px clamp(14px,3vw,28px);overflow-x:auto;color:var(--amber);background:radial-gradient(ellipse at center,#1d150d 0%,var(--crt) 75%);border:1px solid var(--ink);border-radius:10px;box-shadow:4px 4px 0 var(--shadow),inset 0 0 32px #f990211f}.ascii-screen pre{width:max-content;margin:0 auto;font-family:var(--font-pixel);font-size:clamp(7px,1.45vw,11px);line-height:1.7;white-space:pre;text-shadow:0 0 6px var(--amber-glow)}.ascii-screen:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;border-radius:inherit;background:repeating-linear-gradient(to bottom,rgba(0,0,0,.28) 0 1px,transparent 1px 3px);animation:crt-flicker 4s steps(2) infinite}.highlights{display:flex;flex-wrap:wrap;justify-content:center;gap:20px 56px;margin:32px 0 0}.highlight{text-align:center}.highlight__value{font-family:var(--font-pixel);font-size:1.5em;line-height:1.2}.highlight__number{display:inline-block;text-align:right}.highlight__label{margin:8px 0 0;font-size:.85em}.window__actions{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:14px 16px;margin-top:32px}.window__actions .btn{padding:6px 16px;font-size:15px}.btn--ghost{color:var(--ink);background-color:var(--paper);border:1px dashed var(--ink);box-shadow:4px 4px 0 var(--shadow)}.window__actions .btn--terminal{font-family:var(--font-pixel);font-size:12px;color:var(--amber);background-color:var(--crt);border-color:var(--crt);text-shadow:0 0 6px var(--amber-glow)}.lightbox{margin:auto;padding:0;max-width:min(96vw,1600px);overflow:visible;color:var(--paper);background-color:var(--crt);border:2px dashed var(--paper);box-shadow:12px 12px #00000059}.lightbox::backdrop{background-color:#525252d9}.lightbox__figure{margin:0}.lightbox__figure img{display:block;width:auto;height:auto;max-width:min(96vw,1600px);max-height:calc(92vh - 56px)}.lightbox__figure figcaption{padding:12px 16px;font-size:14px;text-align:left}.lightbox__close{position:absolute;top:-20px;right:-16px;font-family:var(--font-pixel)}@keyframes caret-blink{50%{opacity:0}}@keyframes rise-in{0%{opacity:0;transform:translateY(48px) scale(.98)}}@keyframes fade-up{0%{opacity:0;transform:translateY(16px)}}@keyframes chip-pop{0%{opacity:0;transform:scale(.4)}60%{opacity:1;transform:scale(1.15)}to{transform:scale(1)}}@keyframes scan-in{0%{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0 0 0 0)}}@keyframes scanlines-out{0%{opacity:1}to{opacity:0}}@keyframes crt-on{0%{opacity:.6;transform:scaleY(.02);filter:brightness(3)}50%{transform:scaleY(1);filter:brightness(1.8)}to{opacity:1;transform:none;filter:none}}@keyframes crt-flicker{0%,to{opacity:.85}50%{opacity:1}}.js-reveal [data-reveal]:not(.is-visible){opacity:0}.js-reveal [data-reveal=window].is-visible{animation:rise-in .8s var(--ease-out) backwards}.js-reveal [data-reveal=text].is-visible{animation:fade-up .6s var(--ease-out) backwards}.js-reveal .window.is-visible .skills li{animation:chip-pop .4s steps(4,end) backwards;animation-delay:calc(.25s + var(--i, 0) * 45ms)}.js-reveal .window.is-visible .shot__button img{animation:scan-in .9s steps(12,end) .3s backwards}.js-reveal .window.is-visible .shot__button:after{animation:scanlines-out 1.2s ease-out .3s backwards}.js-reveal .window.is-visible .ascii-screen pre{animation:crt-on .7s var(--ease-out) .35s backwards}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-delay:0s!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.duck-bubble{position:fixed;left:0;top:0;z-index:3;pointer-events:none;will-change:transform}.duck-bubble[hidden]{display:none}.duck-bubble__text{position:absolute;left:0;top:0;display:block;width:max-content;max-width:min(240px,70vw);padding:10px 12px;font-family:var(--font-pixel);font-size:11px;line-height:1.6;text-align:left;color:var(--ink);background-color:var(--paper);border:2px dashed var(--ink);box-shadow:5px 5px 0 var(--shadow);transform:translate(-50%,calc(-100% - 6px))}.duck-bubble__text:after{content:"";position:absolute;left:50%;bottom:-9px;width:14px;height:14px;background-color:var(--paper);border-right:2px dashed var(--ink);border-bottom:2px dashed var(--ink);transform:translate(-50%) rotate(45deg)}.duck-bubble.is-popping .duck-bubble__text{animation:bubble-pop .35s steps(4,end)}@keyframes bubble-pop{0%{opacity:0;transform:translate(-50%,calc(-100% - 6px)) scale(.6)}}
