@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;450;500;550;600;650;700&family=Manrope:wght@400;500;600;650;700;750;800&display=swap";:root{color:var(--ink);background:var(--bg);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--bg:#f6f5ef;--surface:#fff;--surface-tint:#eeefe6;--surface-accent:#e9eddf;--border-accent:#d8ddcd;--ink:#232921;--text:#555b50;--muted:#5d6157;--green:#4a5e3b;--focus:#4a5e3b;--rule:#dbddd1;--button-bg:#232921;--button-text:#fff;--shadow:#23292114;--backdrop:#232921bf;--selection:#d7e7ba;--header-height:72px;font-family:DM Sans,sans-serif;font-weight:400}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#141912;--surface:#1b2119;--surface-tint:#1b2119;--surface-accent:#20281e;--border-accent:#34402f;--ink:#ecefe4;--text:#bcc2b3;--muted:#a3aa99;--green:#a8c48a;--focus:#a8c48a;--rule:#2c3529;--button-bg:#ecefe4;--button-text:#141912;--shadow:#00000059;--backdrop:#050805d9;--selection:#3d5230}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:calc(var(--header-height) + 16px)}body{background:var(--bg);min-width:320px;margin:0;transition:background-color .2s,color .2s;overflow-x:clip}a{color:inherit;text-decoration:none}button,a{-webkit-tap-highlight-color:transparent}a:focus-visible,button:focus-visible,summary:focus-visible{outline:3px solid var(--focus);outline-offset:4px;border-radius:2px}h1,h2,h3,h4,h5,p,figure{margin:0}h1,h2,h3,h4,h5{font-family:Manrope,sans-serif;font-weight:600}ul,ol{margin:0;padding:0;list-style:none}::selection{background:var(--selection);color:var(--ink)}.sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition:none!important}}.page-width{width:min(1060px,100% - 96px);margin-inline:auto}.section-anchor{scroll-margin-top:8px}.skip-link{z-index:10;background:var(--button-bg);color:var(--button-text);padding:12px 20px;position:fixed;top:12px;left:12px;transform:translateY(-160%)}.skip-link:focus{transform:translateY(0)}.site-header{z-index:5;background:var(--bg);transition:background-color .2s;position:sticky;top:0}.site-header-inner{height:var(--header-height);border-bottom:1px solid var(--rule);justify-content:space-between;align-items:center;gap:20px;display:flex}.wordmark{letter-spacing:-1px;font-family:Manrope,sans-serif;font-size:1.375rem;font-weight:750}.wordmark span{color:var(--green)}.header-actions{align-items:center;gap:24px;min-width:0;display:flex}.theme-toggle{width:40px;height:40px;color:var(--ink);border:1px solid var(--rule);cursor:pointer;background:0 0;border-radius:50%;flex-shrink:0;place-items:center;padding:0;font-size:1.125rem;transition:border-color .16s,color .16s;display:inline-grid}.theme-toggle:hover{border-color:var(--green);color:var(--green)}.site-header nav{gap:30px;font-size:1rem;display:flex}.site-header nav a{white-space:nowrap;padding-block:10px;transition:color .16s;position:relative}.site-header nav a:hover,.footer-top:hover{color:var(--green);text-underline-offset:5px;text-decoration:underline}.site-header nav a[aria-current]{color:var(--green)}.site-header nav a[aria-current]:after{content:"";background:var(--green);border-radius:2px;height:2px;position:absolute;bottom:2px;left:0;right:0}.site-header nav a[aria-current]:hover{text-decoration:none}.hero{grid-template-columns:minmax(0,1fr) 240px;align-items:center;gap:44px;padding-block:64px;display:grid}.hero-copy{min-width:0}@keyframes enter-left{0%{opacity:0;transform:translate(-48px)}}@keyframes enter-up{0%{opacity:0;transform:translateY(16px)}}.hero h1,.project-hero h1{animation:.8s cubic-bezier(.2,.7,.2,1) both enter-left}.hero-description,.hero-links,.project-hero .eyebrow,.project-intro,.project-hero .hero-links{animation:.7s ease-out .25s both enter-up}.hero-links,.project-hero .hero-links{animation-delay:.4s}@keyframes roll-in{0%{opacity:0;transform:translateX(var(--roll-distance)) rotate(var(--roll-angle))}}.hero-portrait{--roll-distance:120px;--roll-angle:57deg;animation:1.1s cubic-bezier(.2,.7,.2,1) .15s both roll-in}.reveal{opacity:0;transition:opacity .7s ease-out,transform .7s cubic-bezier(.2,.7,.2,1);transform:translateY(24px)}.reveal.is-visible{opacity:1;transform:none}@media (prefers-reduced-motion:reduce){.hero h1,.project-hero h1,.hero-description,.hero-links,.project-hero .eyebrow,.project-intro,.hero-portrait{animation:none}.reveal{opacity:1;transform:none}}.hero-portrait{aspect-ratio:1;object-fit:cover;border:1px solid var(--rule);border-radius:50%;width:100%;height:auto;display:block}.hero h1{letter-spacing:-2.8px;font-size:clamp(38px,5.3vw,64px);font-weight:550;line-height:1.15}.hero h1 em{color:var(--green);letter-spacing:-2px;font-family:Georgia,Times New Roman,serif;font-weight:400}.hero-description{max-width:540px;color:var(--text);margin-top:23px;font-size:1.09375rem;line-height:1.8}.hero-links{align-items:center;gap:26px;margin-top:24px;display:flex}.button{border-radius:4px;justify-content:space-between;align-items:center;gap:30px;padding:14px 18px;font-size:.9375rem;font-weight:500;transition:background-color .16s;display:inline-flex}.button-dark{background:var(--button-bg);color:var(--button-text)}.button-dark:hover{background:var(--green);color:var(--button-text)}.button span{font-size:1.125rem}.hero-social{align-items:center;gap:8px;font-size:.9375rem;display:inline-flex}.hero-social svg{font-size:1.125rem}.hero-social:hover{color:var(--green)}h2{letter-spacing:-.8px;font-size:1.625rem}.work-section{border-top:1px solid var(--rule);padding-top:32px}.work-section+.work-section{margin-top:48px}.section-intro{color:var(--muted);margin-top:8px;font-size:1rem}.project-role{color:var(--green);margin-top:8px;font-size:.84375rem;font-weight:500}.project-dates{color:var(--muted);font-weight:400}.projects-grid{grid-template-columns:1fr 1fr;gap:18px;margin-top:24px;display:grid}.project-card{border:1px solid var(--rule);border-radius:6px;min-width:0;padding:26px}.project-card:first-child{background:var(--surface-tint);border-color:var(--border-accent)}.project-card h3{letter-spacing:-.7px;font-size:1.375rem}.project-card h3 a{justify-content:space-between;align-items:center;gap:15px;display:flex}.project-card h3 a>span[aria-hidden]{color:var(--green);font-size:1.25rem;font-weight:400}.project-card h3 a:hover{color:var(--green)}.project-facts{margin:22px 0 0}.project-facts>div+div{margin-top:16px}.project-facts dt{color:var(--green);text-transform:uppercase;letter-spacing:1px;font-size:.75rem;font-weight:600}.project-facts dd{color:var(--text);margin:5px 0 0;font-size:.9375rem;line-height:1.8}.project-learned{white-space:pre-line;min-height:8px}.project-card.has-details{grid-column:1/-1;grid-template-rows:auto auto 1fr;grid-template-columns:minmax(0,1fr) minmax(0,1fr);column-gap:32px;transition:border-color .16s,box-shadow .16s;display:grid;position:relative}.project-card.has-details>:not(.project-thumb){grid-column:2}.project-card.has-details .project-thumb{grid-area:1/1/-1;align-self:start;margin-bottom:0}.project-card.has-details:hover{border-color:var(--green);box-shadow:0 6px 24px var(--shadow)}.project-card.has-details:hover h3 a{color:var(--green)}.project-link:after{content:"";border-radius:6px;position:absolute;inset:0}.project-thumb{aspect-ratio:16/9;object-fit:cover;object-position:top;border:1px solid var(--rule);border-radius:4px;width:100%;height:auto;margin-bottom:22px;display:block}.project-card-footer{color:var(--muted);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding-top:24px;font-size:.84375rem;display:flex}.project-visit{z-index:1;white-space:nowrap;position:relative}.project-card-actions{align-items:center;gap:20px;display:flex}.project-disclaimer{color:var(--muted);padding-block:8px 40px;font-size:.8125rem}.project-hero{padding-block:56px 36px}.eyebrow{color:var(--green);text-transform:uppercase;letter-spacing:1.2px;font-size:.8125rem;font-weight:600}.project-hero h1{letter-spacing:-2.2px;margin-top:12px;font-size:clamp(36px,5vw,58px);font-weight:600;line-height:1.1}.project-intro{max-width:640px;color:var(--text);margin-top:20px;font-size:1.09375rem;line-height:1.8}.screenshot-button{border:1px solid var(--rule);background:var(--surface);cursor:zoom-in;border-radius:6px;width:100%;padding:0;transition:border-color .16s;display:block;overflow:hidden}.screenshot-button:hover{border-color:var(--green)}.screenshot-button img{width:100%;height:auto;display:block}.project-lead .screenshot-button{box-shadow:0 12px 40px var(--shadow)}.project-summary{grid-template-columns:repeat(3,1fr);gap:32px;margin:0;padding-block:40px;display:grid}.project-summary>div+div{margin-top:0}.project-section{border-top:1px solid var(--rule);padding-block:38px}.stack-list{flex-wrap:wrap;gap:8px;margin-top:20px;display:flex}.stack-list li{background:var(--surface-accent);border:1px solid var(--border-accent);border-radius:999px;padding:6px 12px;font-size:.84375rem}.highlights-grid{grid-template-columns:1fr 1fr;gap:28px 40px;margin-top:32px;display:grid}.highlight h3{letter-spacing:-.3px;font-size:1.09375rem}.highlight p{color:var(--text);margin-top:8px;font-size:.9375rem;line-height:1.8}.screenshot-grid{grid-template-columns:1fr 1fr;gap:32px 24px;margin-top:24px;display:grid}.screenshot-grid .screenshot-button{aspect-ratio:16/10}.screenshot-grid .screenshot-button img{object-fit:cover;object-position:top;height:100%}.screenshot-grid .screenshot-button.is-phone{background:var(--surface-accent)}.screenshot-grid .screenshot-button.is-phone img{object-fit:contain;padding-block:16px}.diagram-list{gap:40px;margin-top:24px;display:grid}.screenshot-grid figcaption,.diagram-list figcaption{color:var(--text);margin-top:12px;font-size:.9375rem;line-height:1.7}.screenshot-grid figcaption strong,.diagram-list figcaption strong{color:var(--ink);font-family:Manrope,sans-serif;font-weight:600;display:block}.lightbox{background:var(--surface);width:min(1200px,100% - 32px);max-height:calc(100% - 32px);color:var(--ink);border:0;border-radius:6px;padding:0;overflow:auto}.lightbox::backdrop{background:var(--backdrop)}.lightbox img{object-fit:contain;background:var(--bg);width:100%;height:auto;max-height:calc(100vh - 140px);display:block}.lightbox p{color:var(--text);padding:14px 20px;font-size:.9375rem;line-height:1.7}.lightbox p strong{color:var(--ink)}.lightbox form{position:absolute;top:10px;right:10px}.lightbox-close{width:36px;height:36px;color:var(--button-text);background:var(--button-bg);cursor:pointer;border:0;border-radius:50%;font-size:1.375rem;line-height:1}.lightbox-close:hover{background:var(--green);color:var(--button-text)}.about-section,.experience-section{border-top:1px solid var(--rule);grid-template-columns:1fr 1fr;gap:60px;padding-block:38px;display:grid}.about-section{margin-top:48px}.about-copy>p{color:var(--text);margin-top:14px;font-size:1rem;line-height:1.8}.education-note{margin-top:20px}.education-note p{font-size:.9375rem;line-height:1.8}.education-note span{color:var(--muted);font-size:.8125rem}.experience-intro>p{color:var(--text);margin-top:12px;font-size:1rem;line-height:1.8}.teaching-skills{gap:16px;margin-top:22px;display:grid}.teaching-skills h3{font-size:1rem}.teaching-skills p{color:var(--text);margin-top:4px;font-size:.9375rem;line-height:1.7}.experience-note{color:var(--text);margin-top:8px;font-size:.9375rem;line-height:1.7}.experience-list li{border-bottom:1px solid var(--rule);padding-block:16px}.experience-list li:first-child{padding-top:0}.experience-list li:last-child{border-bottom:0;padding-bottom:0}.experience-date{letter-spacing:.4px;color:var(--muted);font-size:.75rem}.experience-list h3{margin-top:6px;font-size:1.09375rem}.experience-list h3+p{color:var(--muted);margin-top:5px;font-size:.84375rem}.contact-section{background:var(--surface-accent);border:1px solid var(--border-accent);border-radius:6px;grid-template-columns:1fr 1fr;gap:40px;margin-block:12px 38px;padding:30px;display:grid}.contact-section>div>p{color:var(--text);margin-top:10px;font-size:.9375rem;line-height:1.8}.contact-links{flex-direction:column;justify-content:center;align-items:flex-start;gap:16px;min-width:0;display:flex}.contact-link{align-items:center;gap:10px;min-width:0;font-size:.9375rem;display:inline-flex}.contact-link svg{color:var(--green);flex-shrink:0;font-size:1.125rem}.contact-link:hover{text-underline-offset:5px;text-decoration:underline}.contact-email{letter-spacing:-.3px;overflow-wrap:anywhere;font-size:1.09375rem}.site-footer{border-top:1px solid var(--rule);justify-content:space-between;align-items:center;gap:25px;padding-block:26px 30px;display:flex}.site-footer .wordmark{font-size:1.15625rem}.footer-top{color:var(--muted);font-size:.8125rem}.footer-top span{margin-left:10px}@media (width<=900px){.page-width{width:calc(100% - 64px)}.hero{grid-template-columns:minmax(0,1fr) 180px;gap:28px}.hero-portrait{--roll-angle:76deg}.hero h1{letter-spacing:-1.8px;font-size:clamp(30px,4.4vw,47px)}.about-section,.experience-section{gap:35px}.project-summary{grid-template-columns:1fr;gap:20px}.project-card.has-details{grid-template-rows:none;grid-template-columns:minmax(0,1fr)}.project-card.has-details>:not(.project-thumb),.project-card.has-details .project-thumb{grid-area:auto/1}.project-card.has-details .project-thumb{margin-bottom:22px}.contact-section{gap:20px;padding:25px}.contact-email{font-size:1rem}}@media (width<=650px){.page-width{width:calc(100% - 40px)}:root{--header-height:60px}.site-header-inner{gap:14px}.wordmark{font-size:1.1875rem}.site-header nav{scrollbar-width:none;gap:18px;min-width:0;padding-inline:12px 16px;font-size:.84375rem;overflow-x:auto;-webkit-mask-image:linear-gradient(90deg,#0000,#000 12px calc(100% - 16px),#0000);mask-image:linear-gradient(90deg,#0000,#000 12px calc(100% - 16px),#0000)}.header-actions{gap:8px}.theme-toggle{width:36px;height:36px}.site-header nav::-webkit-scrollbar{display:none}.wordmark{flex-shrink:0}.hero{grid-template-columns:1fr;gap:25px;padding-block:36px 44px}.hero-portrait{--roll-distance:100px;--roll-angle:82deg;grid-row:1;width:140px}.hero h1{letter-spacing:-1.7px;font-size:clamp(33px,7.7vw,48px)}.hero h1 em{letter-spacing:-1px}.hero-description{margin-top:20px;font-size:1.03125rem}.work-section{padding-top:25px}h2{font-size:1.5rem}.projects-grid{grid-template-columns:1fr;gap:14px;margin-top:20px}.project-card{padding:22px}.project-card h3{font-size:1.3125rem}.project-hero{padding-block:36px 28px}.highlights-grid,.screenshot-grid{grid-template-columns:1fr;gap:24px}.about-section,.experience-section{grid-template-columns:1fr;gap:22px;padding-block:30px}.about-section{margin-top:34px}.contact-section{grid-template-columns:1fr;gap:24px;margin-bottom:30px;padding:24px 22px}.contact-email{font-size:1.09375rem}.site-footer{padding-block:24px}}@media (width<=380px){.page-width{width:calc(100% - 32px)}.site-header nav{gap:12px;font-size:.8125rem}.wordmark{font-size:1.15625rem}.hero h1{font-size:1.9375rem}.contact-email{font-size:1rem}}
