@font-face{font-family:DM Sans;font-style:normal;font-weight:100 1000;font-display:swap;src:url(../media/c3cb240f9c892514-s.270md_-rr62el.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-weight:100 1000;font-display:swap;src:url(../media/5c285b27cdda1fe8-s.p.0lsanbtneewqp.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Sans Fallback;src:local(Arial);ascent-override:94.9%;descent-override:29.66%;line-gap-override:0.0%;size-adjust:104.53%}.qGIbxW_className{font-family:DM Sans,DM Sans Fallback;font-style:normal}.qGIbxW_variable{--font-sans-body:"DM Sans", "DM Sans Fallback"}
@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:400;font-display:swap;src:url(../media/d8cddd76dbfeaef0-s.2dbc-et3k6kfe.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:400;font-display:swap;src:url(../media/591574edbe85c69b-s.0slbgzy4000md.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:400;font-display:swap;src:url(../media/acf349172f10b359-s.0d4lnz92g9ol4.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:400;font-display:swap;src:url(../media/0926c12c4384550f-s.253cfg7mpxmwg.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:400;font-display:swap;src:url(../media/8bd76523131fa0fc-s.p.273-hd1b-0-z9.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:500;font-display:swap;src:url(../media/d8cddd76dbfeaef0-s.2dbc-et3k6kfe.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:500;font-display:swap;src:url(../media/591574edbe85c69b-s.0slbgzy4000md.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:500;font-display:swap;src:url(../media/acf349172f10b359-s.0d4lnz92g9ol4.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:500;font-display:swap;src:url(../media/0926c12c4384550f-s.253cfg7mpxmwg.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Cormorant Garamond;font-style:italic;font-weight:500;font-display:swap;src:url(../media/8bd76523131fa0fc-s.p.273-hd1b-0-z9.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:400;font-display:swap;src:url(../media/9cc5c0547f229dea-s.26a4qkxezf9-r.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:400;font-display:swap;src:url(../media/b0947914c9718a1e-s.1hzlq6xrrxf6u.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:400;font-display:swap;src:url(../media/d0b60be57f16ee32-s.33on4mq75bz97.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:400;font-display:swap;src:url(../media/1f9e983605289f29-s.2xsoqmjk136f4.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:400;font-display:swap;src:url(../media/01e4147cff8141ee-s.p.0v7knm2wof07y.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:500;font-display:swap;src:url(../media/9cc5c0547f229dea-s.26a4qkxezf9-r.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:500;font-display:swap;src:url(../media/b0947914c9718a1e-s.1hzlq6xrrxf6u.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:500;font-display:swap;src:url(../media/d0b60be57f16ee32-s.33on4mq75bz97.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:500;font-display:swap;src:url(../media/1f9e983605289f29-s.2xsoqmjk136f4.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Cormorant Garamond;font-style:normal;font-weight:500;font-display:swap;src:url(../media/01e4147cff8141ee-s.p.0v7knm2wof07y.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Cormorant Garamond Fallback;src:local(Times New Roman);ascent-override:95.27%;descent-override:29.59%;line-gap-override:0.0%;size-adjust:96.98%}.pgvNgW_className{font-family:Cormorant Garamond,Cormorant Garamond Fallback}.pgvNgW_variable{--font-serif-display:"Cormorant Garamond", "Cormorant Garamond Fallback"}
:root{--paper:#f5f0e6;--ink:#285694;--muted:#5b6e8a;--rule:#28569429;--ink-soft:#28569480;--ink-faint:#28569435;--surface:#e6e5de;--ease-out:cubic-bezier(.22, 1, .36, 1);--ease-in-out:cubic-bezier(.65, 0, .35, 1);--ease-draw:cubic-bezier(.45, .05, .3, 1);--dur-fast:.2s;--dur-base:.35s;--dur-slow:.7s}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:35px}body{background:var(--paper);color:var(--ink);font-family:var(--font-sans-body), sans-serif;-webkit-font-smoothing:antialiased;margin:0;font-size:14px}body:before{content:"";z-index:10;opacity:.035;pointer-events:none;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Cpath fill='%23000' filter='url(%23n)' opacity='.6' d='M0 0h180v180H0z'/%3E%3C/svg%3E");position:fixed;inset:0}::selection{background:var(--rule)}a{color:inherit;text-decoration:none}button{color:inherit;font:inherit;cursor:pointer}button,a{-webkit-tap-highlight-color:transparent}button:focus-visible,a:focus-visible{outline:2px solid var(--ink);outline-offset:6px}p,h1,h2,h3,figure{margin:0}p{line-height:1.85}h1,h2,h3,.signature,.handwritten,.project-title{font-family:var(--font-serif-display), Georgia, serif;font-weight:400}h1{letter-spacing:-.025em;font-size:clamp(46px,4.8vw,66px);font-style:italic;line-height:1.01}h2{letter-spacing:-.015em;font-size:51px;line-height:1.12}.notebook{max-width:1260px;margin:0 auto;padding:0 62px;position:relative}.section{border-top:1px solid var(--rule);padding:76px 0;scroll-margin-top:15px}.eyebrow{text-transform:uppercase;letter-spacing:.075em;font-size:10px;font-weight:400;line-height:1.6}.handwritten{font-size:22px;font-style:italic;line-height:1.5}.arrow{stroke:currentColor;stroke-width:1.1px;width:17px;height:17px;transition:transform var(--dur-fast) var(--ease-out);flex-shrink:0}.arrow-down{transform:rotate(135deg)}.text-link{border:0;border-bottom:1px solid var(--ink-soft);background:0 0;align-items:center;gap:27px;padding:5px 0 8px;font-size:12px;display:inline-flex}.text-link:hover .arrow,.email-link:hover .arrow{transform:translate(3px,-3px)}.skip-link{z-index:30;background:var(--paper);border:1px solid var(--ink);padding:12px 20px;position:fixed;top:-100px;left:20px}.skip-link:focus{top:12px}body:has(dialog[open]){overflow:hidden}@media (min-width:1450px){.notebook{max-width:1320px}}@media (max-width:1000px){.notebook{padding:0 38px}h1{font-size:50px}.section{padding:60px 0}}@media (max-width:700px){.notebook{padding:0 24px}h1{font-size:clamp(40px,8.6vw,56px)}h2{font-size:42px}.section{padding:46px 0}}@media (min-width:701px) and (max-width:1000px){h1{font-size:clamp(36px,4.6vw,50px)}}.reveal-armed [data-reveal]{opacity:0;transition:opacity var(--dur-slow) var(--ease-out), translate var(--dur-slow) var(--ease-out);transition-delay:calc(var(--reveal-index,0) * 80ms);translate:0 14px}.reveal-armed [data-reveal].is-revealed{opacity:1;translate:none}@keyframes rise-in{0%{opacity:0;translate:0 14px}}@keyframes fade-in{0%{opacity:0}}@keyframes fade-out{to{opacity:0}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition:none!important}.reveal-armed [data-reveal]{opacity:1;translate:none}}
.site-header{--header-collapse:36px;top:calc(var(--header-collapse) * -1);z-index:6;border-bottom:1px solid var(--rule);background:var(--paper);height:100px;box-shadow:0 0 0 100vmax var(--paper);clip-path:inset(0 -100vmax);translate:0 calc(var(--header-offset,0px) * -1);justify-content:space-between;align-items:center;display:flex;position:sticky}.site-header[data-settling]{transition:translate var(--dur-base) var(--ease-out)}.site-header>:not(dialog){translate:0 calc(var(--header-progress,0) * var(--header-collapse) / 2)}.site-header:focus-within{translate:none}.signature{font-size:26px;font-style:italic}.site-header nav{align-items:center;gap:34px;font-size:12px;display:flex}.site-header nav a{transition:opacity var(--dur-base) var(--ease-out)}.site-header nav:has([aria-current]) .section-link:not([aria-current]){opacity:.45}.site-header nav a:hover,.site-header nav .section-link:not([aria-current]):hover{opacity:.6}.social-links{align-items:center;gap:13px;display:flex}.social-links a{place-items:center;display:grid}.social-icon{fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round;width:17px;height:17px}.menu-toggle{display:none}.menu-toggle,.menu-close{background:0 0;border:0;place-items:center;width:44px;height:44px;padding:10px}.menu-toggle svg,.menu-close svg{fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;width:24px;height:24px}.mobile-menu{width:100%;max-width:none;height:100dvh;max-height:none;color:var(--ink);background:0 0;border:0;margin:0;padding:0;position:fixed;inset:0;overflow:clip}.mobile-menu::backdrop{background:#172a434d}.mobile-menu-panel{overscroll-behavior:contain;width:min(86vw,360px);height:100%;padding:max(19px, env(safe-area-inset-top)) 24px max(32px, env(safe-area-inset-bottom));background:var(--paper);border-left:1px solid var(--rule);position:absolute;top:0;right:0;overflow-y:auto;box-shadow:-12px 0 40px #172a431a}.mobile-menu[open] .mobile-menu-panel{animation:.3s cubic-bezier(.22,1,.36,1) both menu-enter}.mobile-menu[open]::backdrop{animation:.3s ease-out both menu-backdrop-enter}.mobile-menu[open][data-closing=true] .mobile-menu-panel{animation:.24s cubic-bezier(.4,0,1,1) both menu-exit}.mobile-menu[open][data-closing=true]::backdrop{animation:.24s ease-in both menu-backdrop-exit}.mobile-menu-heading{border-bottom:1px solid var(--rule);justify-content:space-between;align-items:center;padding-bottom:19px;display:flex}.menu-close{display:grid}.site-header .mobile-menu nav{flex-direction:column;align-items:stretch;gap:8px;padding-top:24px;font-size:15px}.mobile-menu nav>a{padding:12px 0}.mobile-menu .social-links{border-top:1px solid var(--rule);flex-direction:column;align-items:stretch;gap:4px;margin-top:20px;padding-top:20px}.mobile-menu .social-links a{gap:14px;min-height:48px;display:flex}@keyframes menu-enter{0%{transform:translate(100%)}to{transform:translate(0,0)}}@keyframes menu-backdrop-enter{0%{opacity:0}to{opacity:1}}@keyframes menu-exit{0%{transform:translate(0,0)}to{transform:translate(100%)}}@keyframes menu-backdrop-exit{0%{opacity:1}to{opacity:0}}@media (prefers-reduced-motion:reduce){.mobile-menu[open][data-closing] .mobile-menu-panel,.mobile-menu[open][data-closing]::backdrop{animation-duration:1ms}}.site-footer{border-top:1px solid var(--rule);justify-content:space-between;align-items:center;padding:25px 0 23px;display:flex}.site-footer .signature{font-size:24px}.site-footer p{color:var(--muted);margin-top:5px;font-size:9px}.site-footer .text-link{font-size:11px}@media (max-width:700px){.site-header{--header-collapse:26px;height:82px}.signature{font-size:23px}.site-header .desktop-navigation{display:none}.menu-toggle{display:grid}.social-links{gap:10px}.site-footer .signature{font-size:22px}.site-footer .text-link{gap:12px}}
.hero-main{grid-template-columns:1fr 1fr;align-items:center;gap:40px;min-height:650px;padding:54px 0 30px;display:grid}.hero-copy{padding:12px 0 25px 56px}.hero-copy .eyebrow{margin-bottom:29px}.intro-text{width:min-content;max-width:100%;color:var(--muted);margin:28px 0 34px;font-size:15px;line-height:1.9}.intro-lead{white-space:nowrap;display:block}.school-lockup{white-space:nowrap;color:inherit;transition:color var(--dur-fast) ease;align-items:center;gap:.38em;display:inline-flex}.school-mark{background:var(--ink);opacity:.94;width:1.4em;height:1.65em;transition:background var(--dur-fast) ease;flex:none;margin-block:-.35em;transform:rotate(-2deg);-webkit-mask:url(/images/waterloo-crest-sketch.png) 50%/contain no-repeat;mask:url(/images/waterloo-crest-sketch.png) 50%/contain no-repeat}.school-lockup:is(:hover,:focus-visible){color:#7eafdf}.school-lockup:is(:hover,:focus-visible) .school-mark{background:#7eafdf}.wander-link{border-bottom:1px solid var(--ink);align-items:center;gap:20px;padding:7px 0;display:inline-flex}.about{grid-template-columns:minmax(130px,.6fr) minmax(0,1fr) minmax(0,1.2fr);align-items:start;gap:54px;padding:78px 0 82px;display:grid}.experience-history{padding-top:6px}.experience-intro h2{margin-bottom:22px;font-size:clamp(34px,3.5vw,46px)}.experience-intro>p{color:var(--muted);font-size:13px;line-height:1.9}.experience-intro .experience-signoff{color:var(--ink);margin-top:22px;font-size:20px}.experience-list,.technology-list{margin:0;padding:0;list-style:none}.experience-entry{grid-template-columns:66px minmax(0,1fr);gap:16px;padding:11px 0;display:grid}.experience-entry:first-child{padding-top:0}.experience-entry:last-child{padding-bottom:0}.company-mark{justify-content:center;align-items:center;width:66px;height:40px;display:flex}.company-logo{background:var(--ink);width:58px;height:58px;display:block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.company-heading{flex-wrap:wrap;align-items:baseline;gap:6px 12px;display:flex}.company-heading h3{font-family:var(--font-serif-display), Georgia, serif;margin:0;font-size:25px;font-weight:400;line-height:1.2}.experience-position{color:var(--muted);margin-top:6px;font-size:13px;line-height:1.6}.technology-list{flex-wrap:wrap;gap:6px;margin-top:12px;display:flex}.technology-list li{border:1px solid var(--rule);border-radius:4px;padding:3px 8px;font-size:12px;line-height:1.5}.section-heading{justify-content:space-between;align-items:center;gap:20px;margin:30px 0 34px;display:flex}.section-heading>p{color:var(--muted);max-width:275px;font-size:13px;line-height:1.65}.work-note{color:var(--muted);margin-top:32px}@media (min-width:1450px){.hero-main{min-height:700px}}@media (min-width:1001px){.experience-intro{position:relative;left:-28px}.experience-history{position:relative;left:20px}}@media (max-width:1000px){.hero-main{gap:24px;min-height:580px}.hero-copy{padding-left:16px}.hero-copy .eyebrow{font-size:8px}.intro-text{font-size:13px}}@media (min-width:701px) and (max-width:1000px){.hero-copy .eyebrow{max-width:240px}.about{grid-template-columns:110px minmax(0,1fr) minmax(0,1.2fr);gap:30px}.experience-entry{grid-template-columns:58px minmax(0,1fr);gap:10px}.company-mark{width:58px;height:34px}.company-logo{width:50px;height:50px}.company-heading h3{font-size:22px}}@media (max-width:700px){.hero-main{grid-template-columns:1fr;gap:0;padding:25px 0 0}.hero-copy{padding:35px 0 32px}.hero-copy .eyebrow{margin-bottom:23px;font-size:9px}.intro-text{margin:23px 0;font-size:14px}.wander-link{gap:9px;font-size:8px}.about{grid-template-columns:1fr;gap:30px}.section-aside{position:relative}.experience-intro{max-width:420px}.experience-intro h2{font-size:40px}.experience-history{margin-top:4px;padding-top:0}.section-heading{flex-direction:column;align-items:flex-start;gap:15px;margin:24px 0}.section-heading>p{font-size:12px}.work-note{font-size:20px}}.hero .portrait{animation:fade-in 1.1s var(--ease-out) both}.hero-copy>*{animation:rise-in var(--dur-slow) var(--ease-out) both}.hero-copy>:first-child{animation-delay:.15s}.hero-copy>:nth-child(2){animation-delay:.23s}.hero-copy>:nth-child(3){animation-delay:.31s}.hero-copy>:nth-child(4){animation-delay:.39s}@media (prefers-reduced-motion:reduce){.hero .portrait,.hero-copy>*{animation:none}}
.portrait{width:100%;height:580px;position:relative}.portrait-image{width:100%;height:100%;display:block}.portrait-detail{outline:none}.portrait-hotspot{fill:#0000;stroke:none;pointer-events:all;cursor:default}.portrait-detail:focus-visible .portrait-hotspot{stroke:var(--ink);stroke-width:1px;stroke-dasharray:4 5;vector-effect:non-scaling-stroke}.portrait-callout{fill:var(--ink);font-family:var(--font-serif-display), Georgia, serif;pointer-events:none;opacity:0;font-size:46px;font-style:italic;transition:opacity .22s}.portrait-callout-flower-label{font-size:.9em}.portrait-callout-subtitle{font-family:var(--font-sans-body), Arial, sans-serif;opacity:.72;font-size:23px;font-style:normal}.portrait-callout-arrow{fill:none;stroke:var(--ink);stroke-width:1.2px;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}.callout-arrow-trace{fill:none;stroke:#fff;stroke-width:6px;stroke-dasharray:1 2;stroke-dashoffset:1px;transition:stroke-dashoffset 0s linear var(--dur-fast)}.portrait-detail:is(:hover,:focus-visible) .portrait-callout{opacity:1}.portrait-detail:is(:hover,:focus-visible) .callout-arrow-trace{stroke-dashoffset:0;transition:stroke-dashoffset .32s var(--ease-draw) 40ms}.portrait-detail:is(:hover,:focus-visible) .callout-arrow-head{transition:stroke-dashoffset 80ms ease-out .34s}@media (min-width:1450px){.portrait{height:610px}}@media (max-width:1000px){.portrait{height:490px}.portrait-callout{font-size:56px}}@media (max-width:700px){.portrait{width:330px;max-width:100%;height:410px;margin:0 auto}}@media (max-width:700px),(hover:none){.portrait-detail{display:none}}
.joys-heading{justify-content:space-between;align-items:baseline;gap:28px;margin-top:23px;display:flex}.joys-heading h2{font-size:clamp(36px,4vw,51px)}.joys-heading>p{color:var(--muted);font-size:23px}.joys-layout{grid-template-columns:minmax(0,.88fr) minmax(0,1.12fr);align-items:start;gap:76px;margin-top:64px;padding:0 10px 0 20px;display:grid}.joy-gallery{background:#fcf9f1;min-width:0;margin-top:20px;padding:15px 15px 0;position:relative;transform:rotate(-3deg);box-shadow:0 6px 12px #5a503514}.joy-gallery:before,.coffee-note:before{content:"";z-index:1;pointer-events:none;background:#d7ca9f66;width:115px;height:34px;position:absolute;top:-17px;left:36%;transform:rotate(-4deg)}.joy-media{aspect-ratio:4/3;background:var(--surface);position:relative;overflow:hidden}.joy-media video{object-fit:cover;width:100%;height:100%;display:block}.gallery-caption{align-items:center;min-height:63px;padding:12px 2px;display:flex;position:relative}.gallery-caption .handwritten{font-size:21px;line-height:1.2}.gallery-waves{width:145px;height:40px;stroke:var(--ink);stroke-width:1.1px;position:absolute;bottom:-11px;right:1px}.joy-notes{gap:28px;display:grid}.joy-note{isolation:isolate;filter:drop-shadow(0 6px 5px #5a503510);transform:rotate(var(--note-tilt,0deg));transition:transform var(--dur-base) var(--ease-out);grid-template-columns:minmax(0,1fr) 65px;align-items:center;column-gap:22px;padding:25px 26px 29px;display:grid;position:relative}@media (hover:hover){.joy-note:hover{transform:rotate(0)translateY(-3px)}}.record-doodle svg{animation:5s linear infinite paused record-spin}.music-note:hover .record-doodle svg{animation-play-state:running}@keyframes record-spin{to{transform:rotate(1turn)}}@media (prefers-reduced-motion:reduce){.record-doodle svg{animation:none}}.reveal-armed [data-reveal] :is(.joy-note-art,.gallery-waves) :is(path,circle){stroke-dasharray:1 2;stroke-dashoffset:1px}.reveal-armed [data-reveal].is-revealed :is(.joy-note-art,.gallery-waves) :is(path,circle){stroke-dashoffset:0;transition:stroke-dashoffset var(--draw-duration,.7s) var(--ease-draw) calc(var(--reveal-index,0) * 80ms + .28s + var(--draw-delay,0s))}.coffee-note path:first-child{--draw-duration:.55s}.coffee-note path:nth-child(2){--draw-duration:.6s;--draw-delay:.62s}.record-doodle circle:first-child{--draw-duration:.55s}.record-doodle circle:nth-child(2){--draw-duration:.45s;--draw-delay:.15s}.record-doodle circle:nth-child(3){--draw-duration:.35s;--draw-delay:.3s}.record-doodle circle:nth-child(4){--draw-duration:.2s;--draw-delay:.45s}.record-doodle path{--draw-duration:.25s;--draw-delay:.6s}.record-doodle path+path{--draw-delay:.8s}.gallery-waves path:first-child{--draw-delay:.9s}.gallery-waves path:nth-child(2){--draw-delay:1.2s}.joy-note>div:not(.joy-note-art){grid-area:1/1}.joy-note-art{grid-area:1/2}.joy-note-art svg{stroke:currentColor;stroke-width:1.15px;stroke-linecap:round;stroke-linejoin:round;width:58px;height:58px;display:block}.spotify-album-art{object-fit:cover;border-radius:2px;width:60px;height:60px;display:block;box-shadow:2px 3px 8px #233b5d2b}.spotify-track{align-items:center;gap:15px;min-width:0;display:flex}.spotify-track>div{min-width:0}.spotify-track h3{margin-bottom:5px}.joy-note .eyebrow{letter-spacing:0;margin-bottom:9px;font-size:9px}.joy-note h3{margin-bottom:10px;font-size:clamp(25px,2.6vw,32px);line-height:1.15}.joy-note p:not(.eyebrow){color:var(--muted);font-size:12px;line-height:1.8}.coffee-note{--note-tilt:-1deg;padding-bottom:47px}.coffee-note:before{width:86px;height:23px;top:-11px;left:38%;transform:rotate(3deg)}.coffee-note:after{content:"";z-index:-1;clip-path:polygon(0 2%,12% 0,25% 2%,36% 0,48% 2%,60% 0,74% 1%,86% 0,100% 2%,100% 94%,97% 98%,94% 96%,91% 99%,88% 96%,84% 99%,80% 96%,76% 99%,72% 96%,68% 99%,64% 96%,60% 99%,56% 96%,52% 99%,48% 96%,44% 99%,40% 96%,36% 99%,32% 96%,28% 99%,24% 96%,20% 99%,16% 96%,12% 99%,8% 96%,4% 99%,0 96%);background:#fcf9f1;position:absolute;inset:0}.watch-note{--note-tilt:.6deg;background:#e5ebe8;-webkit-mask-image:radial-gradient(9px at calc(100% - 96px) 0,#0000 98%,#000),radial-gradient(9px at calc(100% - 96px) 100%,#0000 98%,#000);mask-image:radial-gradient(9px at calc(100% - 96px) 0,#0000 98%,#000),radial-gradient(9px at calc(100% - 96px) 100%,#0000 98%,#000);-webkit-mask-position:top,bottom;mask-position:top,bottom;-webkit-mask-size:100% 51%;mask-size:100% 51%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-clip:border-box,border-box;mask-clip:border-box,border-box;-webkit-mask-origin:border-box,border-box;mask-origin:border-box,border-box;-webkit-mask-composite:source-over,source-over;mask-composite:add,add;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.watch-note:after{content:"";border-right:1px dashed var(--ink-faint);position:absolute;top:18px;bottom:18px;right:96px}.watch-note .joy-note-art{padding-left:8px}.music-note{--note-tilt:-.6deg;background-color:#fcf9f1;background-image:repeating-linear-gradient(#0000 0 25px,#28569420 25px 26px),none;background-position:0 16px;background-repeat:repeat,repeat;background-size:auto,auto;background-attachment:scroll,scroll;background-origin:padding-box,padding-box;background-clip:border-box,border-box}.music-note:before{content:"";border-left:1px solid var(--ink-faint);position:absolute;top:0;bottom:0;left:15px}.joys{padding-bottom:20px}.joys-signoff{align-items:center;gap:22px;margin-top:64px;font-size:22px;display:flex}.joys-old-website{color:#6384ad;font-family:var(--font-sans-body), sans-serif;letter-spacing:.075em;text-align:right;text-transform:uppercase;text-underline-offset:4px;margin-left:auto;font-size:10px;font-style:normal;font-weight:400;line-height:1.6;text-decoration-thickness:1px;transform:translateY(6px)}.joys-old-website:hover{text-decoration-line:underline}@media (min-width:701px){.joy-gallery{transform-origin:0 0;scale:1.1}.joy-notes{transform-origin:100% 0;scale:.9}}@media (max-width:1000px){.joys-heading{align-items:flex-start}.joys-heading>p{max-width:190px;font-size:20px}.joys-layout{gap:36px;padding-left:10px}.joy-note{grid-template-columns:minmax(0,1fr) 40px;gap:16px;padding:23px 20px 27px}.coffee-note{padding-bottom:37px}.joy-note-art svg{width:40px;height:44px}.spotify-album-art{width:48px;height:48px}.watch-note:after{right:67px}.watch-note{-webkit-mask:none;mask:none}.joy-note p:not(.eyebrow){font-size:11px}.gallery-caption .handwritten{font-size:19px}.gallery-waves{width:105px}}@media (max-width:700px){.joys-heading{flex-direction:column;gap:12px}.joys-heading h2{font-size:37px}.joys-heading>p{max-width:none;font-size:21px}.joys-layout{grid-template-columns:1fr;gap:48px;margin-top:35px;padding:0 6px}.joy-gallery{margin:8px 5px 0}.joy-notes{gap:24px}.joy-note h3{font-size:27px}.joy-note .eyebrow{font-size:8px}.joys-signoff{gap:15px;margin-top:46px;font-size:19px}}
.project-grid{grid-template-columns:repeat(3,1fr);gap:38px 28px;display:grid}.project{min-width:0}.project-button{text-align:left;background:0 0;border:none;width:100%;padding:0;display:block}.project-preview{aspect-ratio:16/10;background:var(--surface);display:block;position:relative;overflow:hidden}.project-preview img{object-fit:cover;transition:transform var(--dur-base) var(--ease-out)}.project-button:hover .project-preview img{transform:scale(1.035)}.project-scene{aspect-ratio:4/3;isolation:isolate;justify-content:center;align-items:center;display:flex}.project-ink{width:100%;height:100%;stroke:var(--ink);stroke-width:1px;opacity:.65;position:absolute;inset:0}.project-paper{--paper-tilt:-4deg;background:var(--paper);border:1px solid var(--rule);width:83%;transform:rotate(var(--paper-tilt));transition:transform var(--dur-base) var(--ease-out);flex-direction:column;padding:clamp(8px,.9vw,12px);display:flex;position:relative;box-shadow:2px 5px 9px #263e5b12}.project-paper-label{text-transform:uppercase;letter-spacing:.06em;margin-bottom:6px;font-size:clamp(6px,.55vw,8px);display:block}.project-photo{aspect-ratio:16/9;border:1px solid #28569418;display:block;position:relative;overflow:hidden}.project-photo img{object-fit:cover}.project-paper-caption{text-align:center;font-family:var(--font-serif-display), Georgia, serif;margin-top:6px;font-size:clamp(13px,1.4vw,19px);font-style:italic;line-height:1.2;display:block}.project-scene-stamp .project-paper{border:0;padding:clamp(10px,1.2vw,15px);-webkit-mask-image:radial-gradient(circle at 5px 0,#0000 3px,#000 3.5px),radial-gradient(circle at 5px 100%,#0000 3px,#000 3.5px),radial-gradient(circle at 0 5px,#0000 3px,#000 3.5px),radial-gradient(circle at 100% 5px,#0000 3px,#000 3.5px);mask-image:radial-gradient(circle at 5px 0,#0000 3px,#000 3.5px),radial-gradient(circle at 5px 100%,#0000 3px,#000 3.5px),radial-gradient(circle at 0 5px,#0000 3px,#000 3.5px),radial-gradient(circle at 100% 5px,#0000 3px,#000 3.5px);-webkit-mask-position:0 0,0 0,0 0,0 0;mask-position:0 0,0 0,0 0,0 0;-webkit-mask-size:10px 100%,10px 100%,100% 10px,100% 10px;mask-size:10px 100%,10px 100%,100% 10px,100% 10px;-webkit-mask-repeat:repeat-x,repeat-x,repeat-y,repeat-y;mask-repeat:repeat-x,repeat-x,repeat-y,repeat-y;-webkit-mask-clip:border-box,border-box,border-box,border-box;mask-clip:border-box,border-box,border-box,border-box;-webkit-mask-origin:border-box,border-box,border-box,border-box;mask-origin:border-box,border-box,border-box,border-box;-webkit-mask-composite:source-in;mask-composite:intersect;-webkit-mask-source-type:auto,auto,auto,auto;mask-mode:match-source,match-source,match-source,match-source}.project-scene-record .project-paper{--paper-tilt:3deg;width:79%}.project-scene-note .project-paper{--paper-tilt:4deg}.project-scene-note .project-paper:before{content:"";z-index:1;background:#c5c9b89c;border-inline:1px dashed #f5f0e680;width:27%;height:18px;position:absolute;top:-10px;left:36%;transform:rotate(-8deg)}.project-scene-photo .project-paper{--paper-tilt:-5deg;width:75%;padding:8px 8px 11px}.project-scene-photo .project-paper-label{display:none}.project-scene-photo .project-photo{aspect-ratio:3/2}.project-scene-photo .project-paper-caption{margin-top:8px}.project-button:is(:hover,:focus-visible) .project-paper{transform:rotate(0)translateY(-3px)}.project-button:hover .project-scene img{transform:none}.project-category{margin-top:18px;font-size:8px;display:block}.project-title{justify-content:space-between;align-items:center;gap:8px;margin-top:11px;font-size:28px;line-height:1.15;display:flex}.project-title .arrow{width:16px;height:16px}.project>p{color:var(--muted);margin-top:13px;font-size:13px;line-height:1.75}.project-dialog{width:min(720px,100vw - 40px);max-height:calc(100dvh - 60px);color:var(--ink);border:1px solid var(--rule);background:var(--paper);margin:auto;padding:0}.project-dialog::backdrop{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);background:#1a2b4266}.dialog-content{padding:36px;position:relative}.dialog-close{background:0 0;border:0;width:30px;height:30px;font-size:30px;line-height:1;position:absolute;top:7px;right:13px}.dialog-content .project-preview-large{aspect-ratio:16/10;margin:7px 0 27px}.project-preview-large img{object-fit:contain;transition:opacity var(--dur-base) ease}[data-project-morph] .project-dialog{view-transition-name:project-dialog}[data-project-morph] .project-dialog .project-preview-large{view-transition-name:project-photo}::view-transition-group(project-photo){animation-duration:.48s;animation-timing-function:var(--ease-out);overflow:hidden}::view-transition-old(project-photo){object-fit:cover;height:100%;animation-duration:.3s}::view-transition-new(project-photo){object-fit:cover;height:100%;animation-duration:.3s}::view-transition-new(project-dialog):only-child{animation:popup-in .42s var(--ease-out) both}::view-transition-old(project-dialog):only-child{animation:.22s ease-in both popup-out}::view-transition-old(root){animation-duration:.32s}::view-transition-new(root){animation-duration:.32s}@keyframes popup-in{0%{opacity:0;transform:translateY(14px)scale(.98)}}@keyframes popup-out{to{opacity:0;transform:translateY(8px)scale(.985)}}.project-image-placeholder{color:var(--muted);place-items:center;font-size:13px;display:grid;position:absolute;inset:0}.dialog-content h2{margin:16px 0;font-size:40px}.project-popup-description{gap:5px;display:grid}.project-popup-description p{color:var(--muted)}.project-popup-description a{color:var(--ink);border-bottom:1px solid var(--ink-soft)}.dialog-meta{flex-wrap:wrap;align-items:center;gap:12px 24px;display:flex}.project-links{flex-wrap:wrap;gap:24px;margin-left:auto;display:flex}.project-links .text-link{justify-content:center;min-width:88px}@media (max-width:1000px){.project-grid{gap:22px}.project-title{font-size:24px}}@media (max-width:700px){.project-grid{grid-template-columns:1fr;gap:34px}.project-paper-label{font-size:8px}.project-paper-caption{font-size:19px}.project-category{font-size:9px}.project-title{font-size:29px}.project>p{font-size:13px}.dialog-content{padding:29px 24px}.dialog-content h2{font-size:35px}}@media (prefers-reduced-motion:reduce){.project-preview img,.project-paper{transition:none}.project-button:hover .project-preview img{transform:none}.project-button:is(:hover,:focus-visible) .project-paper{transform:rotate(var(--paper-tilt))}}
.flower-flight{z-index:4;pointer-events:none;visibility:hidden;transform-origin:50%;width:264px;position:absolute;top:0;left:0}.notebook[data-flower-flight=falling] .flower-flight{will-change:transform}.flower-flight svg{width:100%;height:auto;display:block;overflow:visible}.flower-landing{aspect-ratio:264/256;width:110px;margin-top:26px}.flower-landing svg{width:100%;height:100%;display:block;overflow:visible;transform:rotate(-90deg)}.notebook[data-flower-flight=falling] .portrait-attached-flower,.notebook[data-flower-flight=landed] .portrait-attached-flower,.notebook[data-flower-flight=attached] .flower-landing svg,.notebook[data-flower-flight=returning] .flower-landing svg,.notebook[data-flower-flight=falling] .flower-landing svg{visibility:hidden}.notebook[data-flower-flight=returning] .portrait-attached-flower{animation:.65s ease-in-out both portrait-flower-return}@keyframes portrait-flower-return{0%{opacity:0}to{opacity:1}}@media (max-width:700px){.flower-landing{width:48px;margin:0;position:absolute;top:-16px;right:0}.about .section-aside{padding-right:60px}.hero-copy .intro-text{max-width:calc(100% - 40px)}}@media (prefers-reduced-motion:reduce){.notebook[data-flower-flight=returning] .portrait-attached-flower{animation:none}.flower-flight{display:none}.notebook[data-flower-flight] .portrait-attached-flower,.notebook[data-flower-flight] .flower-landing svg{visibility:visible}}
