@font-face{font-family:DM Sans Variable;font-style:normal;font-display:swap;font-weight:100 1000;src:url(/_astro/dm-sans-latin-wght-normal.Xz1IZZA0.woff2)format("woff2")}:root{--paper:#f4f1eb;--ink:#292722;--muted:#666158;--accent:#993a25;--line:#cec8bc;--surface:#eae5dc;--body:"DM Sans Variable", Arial, sans-serif;--serif:"Palatino Linotype", "Book Antiqua", Palatino, Georgia, serif;--mono:"SFMono-Regular", Consolas, "Liberation Mono", monospace;--display:var(--body);font-family:var(--body);color:var(--ink);background:var(--paper);color-scheme:light;font-synthesis:none;scroll-behavior:smooth;scroll-padding-top:35px}*{box-sizing:border-box}body{margin:0}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;cursor:pointer}button:disabled{cursor:default}a,button{-webkit-tap-highlight-color:transparent;touch-action:manipulation}img,svg{max-width:100%;display:block}[hidden]{display:none!important}a:focus-visible,button:focus-visible{outline:2px solid var(--accent);outline-offset:5px}::selection{color:var(--paper);background:var(--accent)}h1,h2,h3,h4,p,figure{margin:0}h1,h2,h3{font-family:var(--serif);font-weight:400}h2{letter-spacing:-1.8px;font-size:clamp(34px,3.6vw,48px);line-height:1.12}h3{letter-spacing:-.7px;font-size:29px;line-height:1.2}p{line-height:1.75}.wrap{width:min(1120px,100% - 112px);margin-inline:auto}.eyebrow,.mono,.margin-note,.hero-index,.section-margin,.image-caption,.project-date,.project-type,.project-detail,.experience-note dt,.lcd-caption,.easter-hint{font-family:var(--mono);font-weight:400}.eyebrow{letter-spacing:.6px;text-transform:uppercase;font-size:10px}.margin-note{color:var(--muted);font-size:11px;line-height:1.7}.skip-link{background:var(--ink);color:var(--paper);z-index:100;padding:12px 18px;position:fixed;top:-100px;left:20px}.skip-link:focus{top:16px}.site-header{border-bottom:1px solid var(--ink);align-items:center;gap:38px;height:95px;display:flex}.wordmark{font-family:var(--mono);letter-spacing:-1.5px;font-size:23px}.wordmark-dot{color:var(--accent)}.site-header nav{gap:34px;margin-left:auto;display:flex}.site-header nav a,.nav-contact{padding-block:12px;font-size:13px}.site-header nav a:hover,.nav-contact:hover{color:var(--accent);text-underline-offset:5px;text-decoration:underline}.nav-contact{gap:16px;display:flex}.hero{padding:29px 0 78px}.hero-index{color:var(--muted);justify-content:space-between;font-size:10px;display:flex}.hero-index span:last-child{color:var(--accent)}.hero-main{grid-template-columns:1.12fr 1fr;align-items:center;gap:clamp(35px,5vw,80px);margin:58px 0 12px;display:grid}.hero-intro{padding-top:38px}.hero-intro>.eyebrow{color:var(--accent);margin-bottom:22px;line-height:1.8;display:block}.hero-intro>p:first-of-type{letter-spacing:-.7px;font-size:clamp(23px,2.2vw,29px);line-height:1.45}.hero-intro .hero-subtext{margin-top:20px}.hero-name .eyebrow{color:var(--accent);text-transform:none;margin-bottom:22px;font-size:12px;display:block}h1{letter-spacing:-.075em;font-size:clamp(90px,11vw,148px);line-height:.88}h1 span{color:var(--accent)}.hero-subtext{color:var(--muted);max-width:580px;margin-top:16px;font-size:15px}.hero-links{gap:32px;margin-top:24px;display:flex}.text-link{border:0;border-bottom:1px solid var(--ink);background:0 0;align-items:center;gap:20px;padding:6px 0;font-size:13px;line-height:1.4;display:inline-flex}.text-link span{font-size:17px}.text-link:hover{color:var(--accent);border-color:var(--accent)}.section-shell{border-top:1px solid var(--line);grid-template-columns:172px minmax(0,1fr);gap:30px;padding-block:52px 70px;display:grid}.section-margin{flex-direction:column;align-items:flex-start;gap:9px;padding-top:6px;font-size:11px;display:flex}.section-number{color:var(--accent);margin-bottom:10px;font-size:12px}.section-margin>p{color:var(--muted);margin-top:11px;font-size:10px;line-height:1.6}.section-heading{justify-content:space-between;align-items:center;gap:25px;margin-bottom:34px;display:flex}.featured-project{grid-template-columns:1.25fr 1fr;align-items:center;gap:32px;padding-bottom:38px;display:grid}.knapp-preview{min-width:0;display:block}.knapp-preview img{border:1px solid var(--line);width:100%;height:auto}.knapp-preview:hover img{outline:1px solid var(--accent)}.image-caption{color:var(--muted);justify-content:space-between;margin-top:10px;font-size:10px;display:flex}.featured-copy .eyebrow{color:var(--accent);font-size:9px}.featured-copy h3{margin-top:13px;font-size:33px}.featured-copy p{color:var(--muted);margin-top:15px;font-size:14px}.featured-copy .project-detail{font-family:var(--body);font-size:12px}.featured-copy .text-link{margin-top:16px}.project-row{border-top:1px solid var(--line);grid-template-columns:90px 1fr auto;gap:25px;padding:30px 0;display:grid}.project-date{padding-top:5px;font-size:10px;line-height:1.8}.project-date span{color:var(--muted)}.project-row h3{letter-spacing:-.5px;font-size:25px}.project-row h3 a:hover{color:var(--accent)}.project-row h3 a span{font-size:17px}.project-row p{color:var(--muted);max-width:550px;margin:13px 0;font-size:14px}.project-detail,.project-type{color:var(--muted);font-size:9px;line-height:1.7}.project-type{padding-top:8px}.pi-project{grid-template-columns:90px 1fr 170px}.lcd-illustration{align-self:center}.lcd-screen{color:#e0e5cc;font-family:var(--mono);background:#333b30;border:5px solid #494e44;flex-direction:column;padding:15px 12px;font-size:10px;line-height:1.9;display:flex}.lcd-screen span:first-child{letter-spacing:1px;margin-bottom:4px;font-size:8px}.lcd-caption{color:var(--muted);margin-top:8px;font-size:8px;display:block}.services{border-top:1px solid var(--ink);margin-top:18px;padding-top:28px}.services>p{color:var(--muted);max-width:600px;margin:14px 0 22px;font-size:15px}.services-list{margin:0 0 20px}.services-list>div{border-top:1px solid var(--line);grid-template-columns:135px 1fr;gap:20px;padding-block:13px;display:grid}.services-list dt{font-size:14px}.services-list dd{color:var(--muted);margin:0;font-size:13px;line-height:1.7}.about-grid{grid-template-columns:1.35fr 1fr;gap:50px;margin-top:34px;display:grid}.about-copy p{color:var(--muted);margin-bottom:19px;font-size:15px}.about-copy .about-lead{color:var(--ink);letter-spacing:-.5px;font-size:23px;line-height:1.45}.about-copy h3{margin:28px 0 14px;font-size:25px}.social-links{gap:28px;margin-top:20px;display:flex}.experience-note{border-left:1px solid var(--line);align-self:start;padding:3px 0 0 25px}.experience-note>.eyebrow{color:var(--accent)}.experience-note dl{margin:29px 0 0}.experience-note dl>div{margin-bottom:26px}.experience-note dt{color:var(--muted);margin-bottom:7px;font-size:10px}.experience-note dd{margin:0;font-size:17px}.experience-note dd span{color:var(--muted);margin-top:6px;font-size:11px;line-height:1.5;display:block}.outside-work{border-top:1px solid var(--line);margin-top:38px;padding-top:26px}.outside-work>h3{margin-bottom:22px;font-size:25px}.outside-grid{grid-template-columns:1fr 1.4fr 1fr;gap:28px;display:grid}h4{font-family:var(--mono);color:var(--accent);margin-bottom:11px;font-size:10px;font-weight:400}.outside-grid p{color:var(--muted);font-size:12px;line-height:1.8}.play-grid{border-block:1px solid var(--line);grid-template-columns:1fr 1fr;display:grid}.game-card{align-items:center;gap:25px;padding:30px 23px 30px 0;display:flex}.game-card+.game-card{border-left:1px solid var(--line);padding:30px 0 30px 23px}.game-card .eyebrow{color:var(--muted);font-size:9px}.game-card h3{letter-spacing:-.5px;margin:11px 0 10px;font-size:23px}.game-card p{color:var(--muted);margin-bottom:12px;font-size:12px}.game-card .text-link{font-size:12px}.memory-art{color:var(--accent);flex-shrink:0;grid-template-columns:repeat(2,28px);gap:5px;display:grid}.memory-art span{border:1px solid var(--line);width:28px;height:39px;font-family:var(--mono);place-items:center;font-size:15px;display:grid}.memory-art span:nth-child(2n){background:var(--surface)}.graph-art{width:77px;color:var(--accent);flex-shrink:0}.easter-hint{color:var(--muted);margin-top:22px;font-size:10px}.easter-hint span{margin-left:12px}.noscript-note{color:var(--muted);margin-top:15px;font-size:13px}.contact-section{padding-top:48px;padding-bottom:64px}.contact-section h2{font-size:clamp(42px,4.6vw,64px)}.contact-section .section-content>p{color:var(--muted);margin-top:20px;font-size:15px}.email-link{letter-spacing:-1.2px;color:var(--accent);border-bottom:1px solid var(--accent);overflow-wrap:anywhere;margin-top:25px;padding-bottom:6px;font-size:clamp(20px,2.65vw,35px);display:inline-block}.email-link:hover{color:var(--ink);border-color:var(--ink)}.contact-bottom{justify-content:space-between;align-items:center;gap:25px;margin-top:25px;display:flex}.contact-actions{align-items:center;gap:25px;display:flex}.copy-email{font-family:var(--mono);color:var(--muted);text-underline-offset:4px;background:0 0;border:0;padding:10px 0;font-size:10px;text-decoration:underline}.endnote{font-family:var(--mono);color:var(--muted);justify-content:flex-end;align-items:center;gap:16px;padding-bottom:25px;font-size:10px;display:flex}.smiley{font-family:var(--mono);width:38px;height:38px;color:var(--accent);background:0 0;border:0;font-size:18px}.smiley.wink{transform:rotate(-12deg)}.smiley:hover{background:var(--surface)}.site-footer{border-top:1px solid var(--ink);justify-content:space-between;align-items:center;gap:20px;padding-block:24px 33px;display:flex}.footer-name{font-size:12px}.footer-note{font-family:var(--mono);color:var(--muted);font-size:9px}.footer-links{color:var(--muted);align-items:center;gap:24px;font-size:11px;display:flex}.footer-links a:hover{color:var(--accent);text-decoration:underline}.footer-links a:last-child{padding:2px 7px;font-size:19px}.toast{background:var(--ink);color:var(--paper);opacity:0;pointer-events:none;z-index:20;text-align:center;width:max-content;max-width:calc(100% - 32px);padding:16px 22px;font-size:13px;transition:opacity .2s,transform .2s;position:fixed;bottom:25px;left:50%;transform:translate(-50%,12px);box-shadow:0 5px 20px #0002}.toast.visible{opacity:1;transform:translate(-50%)}.button{border:1px solid var(--ink);background:var(--ink);color:var(--paper);justify-content:center;align-items:center;gap:20px;padding:12px 18px;font-size:13px;display:inline-flex}.button:hover{background:var(--accent);border-color:var(--accent)}dialog{background:var(--paper);color:var(--ink);border:1px solid var(--ink);border-radius:0;width:min(520px,100% - 32px);max-height:calc(100dvh - 32px);padding:27px 32px 30px;overflow:auto;box-shadow:0 25px 100px #0003}dialog::backdrop{background:#292722b3}.dialog-top{justify-content:space-between;align-items:center;margin-bottom:19px;display:flex}.dialog-top .eyebrow{color:var(--accent);font-size:10px}.dialog-close{border:1px solid var(--line);background:0 0;width:38px;height:38px;font-size:26px;line-height:1}.dialog-close:hover{background:var(--surface)}dialog h2{letter-spacing:-1.5px;margin-bottom:12px;font-size:37px}#game-description{color:var(--muted);margin-bottom:22px;font-size:13px;line-height:1.6}#game-status{min-height:43px;color:var(--accent);margin:20px 0 12px;font-size:13px}.game-actions{justify-content:space-between;align-items:center;gap:15px;display:flex}.game-actions .button{gap:20px;padding:12px 18px;font-size:12px}.game-actions .mono{font-size:10px}.memory-board{grid-template-columns:repeat(4,1fr);gap:10px;display:grid}.memory-card{aspect-ratio:4/5;border:1px solid var(--line);background:var(--surface);font-family:var(--mono);font-size:31px;transition:background .2s}.memory-card:hover{border-color:var(--accent)}.memory-card.flipped{background:var(--paper)}.memory-card.matched{background:var(--accent);color:var(--paper);border-color:var(--accent)}.memory-card:disabled{opacity:1}.clique-board{aspect-ratio:1.4;background:var(--surface);border:1px solid var(--line);width:100%;position:relative}.clique-lines{width:100%;height:100%;position:absolute;inset:0}.clique-lines line{stroke:var(--muted);stroke-width:.55px}.clique-lines line.selected-edge{stroke:var(--accent);stroke-width:1.3px}.graph-node{border:1px solid var(--muted);background:var(--paper);width:43px;height:43px;font-family:var(--mono);border-radius:50%;font-size:15px;position:absolute;transform:translate(-50%,-50%)}.graph-node[aria-pressed=true]{background:var(--accent);color:var(--paper);border:2px solid var(--accent)}.clique-key{color:var(--muted);margin:12px 0 0;font-size:10px}.retro-mode{--paper:#122d4a;--ink:#f0efe4;--muted:#b5c9dc;--accent:#ffd5a1;--line:#55708a;--surface:#1b3b5b;color-scheme:dark}.retro-mode .hero{background-image:linear-gradient(#ffffff07 1px,#0000 1px),linear-gradient(90deg,#ffffff07 1px,#0000 1px);background-size:24px 24px}.prose-page{max-width:740px;min-height:65vh;padding-block:65px 90px}.prose-page h1{letter-spacing:-3px;margin:22px 0 28px;font-size:65px;line-height:1.1}.prose-page h2{letter-spacing:-.7px;margin:32px 0 15px;font-size:29px}.prose-page p,.prose-page li{color:var(--muted);margin-bottom:15px;font-size:15px;line-height:1.8}.prose-page a:not(.button){text-underline-offset:3px;text-decoration:underline}.prose-page .eyebrow{color:var(--accent)}.prose-page .button{margin-top:24px}.prose-page ul{padding-left:20px}@media (width<=1100px){.wrap{width:calc(100% - 72px)}.section-shell,.featured-project{gap:25px}.project-row{grid-template-columns:72px 1fr auto;gap:20px}.pi-project{grid-template-columns:72px 1fr 150px}.about-grid{gap:30px}.game-card{gap:16px}.game-card h3{font-size:21px}.memory-art{grid-template-columns:repeat(2,23px)}.memory-art span{width:23px;height:32px}.graph-art{width:60px}}@media (width<=800px){.wrap{width:calc(100% - 48px)}.hero-main{grid-template-columns:1fr;gap:30px;margin:42px 0 0}.hero-intro{max-width:580px;padding-top:0}.hero-intro>.eyebrow{margin-bottom:14px}h1{font-size:110px}.section-shell,.section-margin p{display:none}.featured-project{grid-template-columns:1fr;gap:21px}.featured-copy p{max-width:490px}.project-type{display:none}.project-row{grid-template-columns:70px 1fr}.pi-project .lcd-illustration{grid-column:2;max-width:190px}.about-grid{grid-template-columns:1fr;gap:32px}.experience-note dl{grid-template-columns:1fr 1fr;gap:20px;margin-top:20px;display:grid}.experience-note dl>div{margin:0}.outside-grid{grid-template-columns:1fr;gap:22px}.outside-grid p{font-size:14px}.play-grid{grid-template-columns:1fr}.game-card,.game-card+.game-card{border-left:0;gap:30px;padding:25px 0}.game-card+.game-card{border-top:1px solid var(--line)}.game-card h3{font-size:25px}.game-card p,.game-card .text-link{font-size:13px}.memory-art{grid-template-columns:repeat(2,29px)}.memory-art span{width:29px;height:39px}.graph-art{width:63px}.section-heading>.margin-note{display:none}.contact-bottom{flex-wrap:wrap;gap:20px}.footer-note{display:none}}@media (width<=560px){.wrap{width:calc(100% - 40px)}.site-header{gap:23px;height:77px}.wordmark{font-size:19px}.site-header nav a{font-size:12px}.site-header{gap:12px}.site-header nav{gap:8px}.site-header nav a{justify-content:center;min-width:44px;font-size:12px}.nav-contact{display:inline-flex}.hero{padding-top:23px;padding-bottom:45px}.hero-index{font-size:9px}.hero-index span:last-child{display:none}.hero-main{gap:29px;margin-top:32px;margin-bottom:0}.hero-intro>p:first-of-type{font-size:24px}.hero-intro>.eyebrow{font-size:10px}.hero-name .eyebrow{margin-bottom:22px;font-size:11px}h1{letter-spacing:-.07em;font-size:clamp(76px,20vw,110px);line-height:.96}.hero-subtext{margin-top:15px;font-size:16px}.hero-links{gap:29px;margin-top:22px}.text-link{font-size:12px}.section-shell{padding-block:30px 45px;display:block}.section-margin{flex-direction:row;align-items:center;gap:12px;margin-bottom:27px;padding:0;font-size:10px}.section-number{margin-bottom:0;font-size:10px}h2{letter-spacing:-1.4px;font-size:36px}.section-heading{gap:20px;margin-bottom:25px}.section-heading .text-link{gap:12px;font-size:11px}.featured-copy h3{margin-top:11px;font-size:32px}.featured-copy p{margin-top:12px;font-size:15px}.featured-project{padding-bottom:27px}.project-row{grid-template-columns:60px 1fr;gap:15px;padding-block:25px}.project-date{font-size:9px}.project-row h3{font-size:24px}.project-row p{font-size:15px}.project-detail{font-size:8px}.services{margin-top:8px}.services>p{font-size:15px}.services-list>div{grid-template-columns:94px 1fr;gap:15px}.services-list dt{font-size:13px}.services-list dd{font-size:15px}.about-grid{margin-top:27px}.about-copy .about-lead{font-size:22px}.about-copy p{font-size:16px}.experience-note{padding-left:20px}.experience-note dl{gap:22px 18px}.experience-note dt{font-size:9px}.experience-note dd{font-size:16px}.experience-note dd span{font-size:10px}.outside-work{margin-top:30px}.outside-grid p{font-size:15px}.outside-grid h4{font-size:11px}.game-card,.game-card+.game-card{gap:25px}.game-card h3{font-size:23px}.easter-hint{font-size:9px;line-height:1.8}.easter-hint span{margin-left:3px}.contact-section h2{font-size:46px}.contact-section .section-content>p{margin-top:18px;font-size:15px}.email-link{letter-spacing:-.8px;margin-top:23px;font-size:23px}.contact-bottom{margin-top:21px}.contact-bottom .margin-note{font-size:10px}.endnote{padding-bottom:15px;font-size:9px}.site-footer{gap:15px;padding-block:20px 27px}.footer-name{font-size:11px}.footer-links{gap:18px;font-size:10px}.footer-links a:last-child{padding-inline:2px}dialog{padding:22px}dialog h2{font-size:33px}.memory-board{gap:8px}.memory-card{font-size:27px}.graph-node{width:44px;height:44px}.prose-page{padding-block:45px 65px}.prose-page h1{letter-spacing:-2px;font-size:46px}}@media (prefers-reduced-motion:reduce){:root{scroll-behavior:auto}*,:before,:after{transition:none!important;animation:none!important}}.site-header a,.text-link,.copy-email,.footer-links a,.smiley,.dialog-close,.button{min-height:44px}.site-header a,.footer-links a{align-items:center;display:inline-flex}.smiley,.dialog-close{min-width:44px}@media (width<=560px){.services-list>div{grid-template-columns:1fr;gap:6px}.project-row{grid-template-columns:1fr;gap:10px}.project-date{gap:8px;font-size:10px;display:flex}.project-date br{display:none}.pi-project .lcd-illustration{grid-column:1}.section-heading{align-items:flex-start}.section-heading>.text-link{flex-shrink:0}.game-card p{font-size:15px}#game-description,#game-status{font-size:14px}.footer-links{gap:12px}.footer-links a{min-width:32px}}@media (width<=359px){.hero-name h1{font-size:76px}.section-heading{flex-wrap:wrap;gap:8px}.experience-note dl{grid-template-columns:1fr}.game-card,.game-card+.game-card{gap:17px}.email-link{font-size:21px}.game-actions{flex-wrap:wrap}}
