@font-face{font-display:swap;font-family:Gasoek One;font-weight:400;src:url(/fonts/gasoek-one/latin.woff2) format("woff2")}@font-face{font-display:swap;font-family:Host Grotesk;font-weight:300 800;src:url(/fonts/host-grotesk/latin.woff2) format("woff2")}:root{--forest: oklch(32% .075 145deg);--deep: oklch(25% .06 145deg);--rose: oklch(72% .17 10deg);--rose-ink: oklch(22% .05 355deg);--rose-shadow: oklch(51% .2 5deg);--cream: oklch(93% .03 100deg);--butter: oklch(88% .16 95deg);--butter-ink: oklch(24% .05 110deg);--shadow: rgb(0 0 0 / .45);--gutter: clamp(20px, 5.5vw, 64px);--space: clamp(34px, 6.5vw, 72px);--motion: .48s cubic-bezier(.25, .1, .25, 1);--felt-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='turbulence' baseFrequency='.55' numOctaves='5' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .3 -.05'/%3E%3C/filter%3E%3Crect width='220' height='220' filter='url(%23n)'/%3E%3C/svg%3E");--felt: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='turbulence' baseFrequency='.55' numOctaves='5' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .55 -.08'/%3E%3C/filter%3E%3Crect width='220' height='220' filter='url(%23n)'/%3E%3C/svg%3E");background:var(--deep);color:var(--cream);font:400 1rem/1.5 Host Grotesk,sans-serif;scrollbar-gutter:stable}*{box-sizing:border-box}body{font-size:1.05rem;margin:0}button,input,textarea{font:inherit}button{cursor:pointer}button:disabled{cursor:default;opacity:.55}a{color:inherit}img{display:block;max-width:100%}h1,h2,h3,p,ul,dl,dd,figure{margin:0}h1,h2{font-family:Gasoek One,sans-serif;font-weight:400}h1{color:var(--rose);font-size:clamp(2.4rem,6.6vw,4.2rem);line-height:1.02;margin-bottom:clamp(24px,4vw,40px)}h2{color:var(--rose);font-size:clamp(1.5rem,3.4vw,2.15rem);line-height:1.1;margin-bottom:24px}h3{font-weight:650}p+p{margin-top:12px}::selection{background:var(--rose);color:var(--rose-ink)}:focus-visible{outline:3px solid currentcolor;outline-offset:4px}main:focus,h1[tabindex="-1"]:focus{outline:none}.sr-only{clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.band{background:var(--band-color, var(--forest)) var(--felt);background-size:220px;padding:var(--space) var(--gutter) calc(var(--space) + 22px);position:relative}.band:after{background:var(--felt-light) 0 0 / 220px,repeating-linear-gradient(90deg,var(--rose) 0 54px,var(--butter) 54px 108px,var(--cream) 108px 162px);bottom:0;content:"";height:22px;left:0;position:absolute;right:0}.section-inner{margin-inline:auto;max-width:1180px}.tone-deep{--band-color: var(--deep)}.tone-butter{--band-color: var(--butter);background-image:var(--felt-light);color:var(--butter-ink)}.tone-rose{--band-color: var(--rose);background-image:var(--felt-light);color:var(--rose-ink)}.tone-butter h2,.tone-rose h2{color:inherit}.patch{align-items:center;background:var(--butter) var(--felt-light);background-size:220px;border:0;border-radius:6px;box-shadow:0 4px 0 var(--shadow),0 6px 12px var(--shadow);color:var(--butter-ink);display:inline-flex;font-weight:700;justify-content:center;min-height:44px;outline:2px dashed var(--butter-ink);outline-offset:-6px;padding:10px 16px;text-decoration:none;transition:translate var(--motion),box-shadow var(--motion)}.patch-rose{background-color:var(--rose);color:var(--rose-ink);outline-color:var(--rose-ink)}.patch[aria-current=page],.patch[aria-pressed=true]{background-color:var(--rose);color:var(--rose-ink);outline-color:var(--rose-ink);translate:0 2px}.patch:focus-visible{outline:3px solid var(--cream);outline-offset:4px}.patch:active{translate:0 2px}.text-link{align-items:center;display:inline-flex;font-weight:650;min-height:44px;text-decoration-thickness:2px;text-underline-offset:5px}.text-link:hover{text-decoration-thickness:3px}.text-button{background:none;border:0;color:inherit;min-height:44px;padding:0 8px;text-decoration:underline}.site-header{background:var(--deep) var(--felt);background-size:220px;box-shadow:0 6px 14px var(--shadow);padding:12px clamp(20px,4vw,48px);position:sticky;top:0;z-index:40}.nav-inner{align-items:center;display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between;margin-inline:auto;max-width:1180px}.wordmark{color:var(--butter);font:400 clamp(1.6rem,2.8vw,2.2rem) / 1 "Gasoek One",sans-serif;padding-block:4px;text-decoration:none;text-shadow:3px 3px 0 var(--rose-shadow)}.site-header ul{display:flex;flex-wrap:wrap;gap:10px;list-style:none;padding:0}.menu-button{display:none}.skip-link{background:var(--butter);color:var(--butter-ink);left:16px;padding:12px;position:absolute;top:-100px;z-index:50}.skip-link:focus{top:12px}.hero{align-items:center;display:grid;gap:clamp(26px,5vw,52px);grid-template-columns:1.2fr 1fr}.portrait-frame{aspect-ratio:3 / 2;background:var(--butter) var(--felt-light);border:0;border-radius:0;box-shadow:0 14px 28px var(--shadow);display:block;outline:2px dashed var(--butter-ink);outline-offset:-8px;padding:12px;rotate:-2deg;width:100%}.portrait-frame img{height:100%;object-fit:cover;width:100%}.home-intro h1{font-size:clamp(2.2rem,4.8vw,3.6rem);line-height:1.08;margin-bottom:24px}.home-intro p{font-size:clamp(1.15rem,2.6vw,1.5rem);line-height:1.5;max-width:38ch}.three-up{display:grid;gap:28px;grid-template-columns:repeat(3,minmax(0,1fr))}.project-tile,.event-link{display:block;text-decoration:none}.tile-image{aspect-ratio:3 / 2;border:5px solid currentcolor;margin-bottom:18px;overflow:hidden}.tile-image img{height:100%;object-fit:cover;object-position:top;transition:scale var(--motion);width:100%}.project-tile h3{font-family:Gasoek One,sans-serif;font-size:clamp(1.2rem,2.6vw,1.8rem);font-weight:400;line-height:1.12;margin-bottom:12px}.section-action{margin-top:28px}.contact-band:after{display:none}.contact-band{padding-bottom:var(--space)}.contact-band h2{font-size:clamp(2rem,4.6vw,3.4rem);margin-bottom:14px}.directory{display:flex;flex-wrap:wrap;gap:2px 18px;list-style:none;padding:0}.directory li{align-items:baseline;display:inline-flex}.directory li+li:before{content:"/";margin-right:8px;opacity:.65}.directory a{overflow-wrap:anywhere}.project-layout{align-items:start;display:grid;gap:clamp(32px,5vw,64px);grid-template-columns:minmax(0,1fr) minmax(0,1.08fr)}.project-list{min-width:0}.featured-project{color:inherit;display:block;padding-block:18px;scroll-margin-top:var(--project-scroll-margin, 100px);text-decoration:none}.featured-project h2{background-image:linear-gradient(var(--rose),var(--rose));background-position:0 100%;background-repeat:no-repeat;background-size:0% 3px;color:var(--cream);display:inline;font:750 clamp(1.25rem,2.8vw,1.6rem) / 1.2 "Host Grotesk",sans-serif;letter-spacing:-.01em;margin:0;transition:background-size var(--motion)}.featured-project.is-selected h2{background-size:100% 3px}.featured-project p{margin-top:6px;max-width:52ch}.smaller-projects{margin-top:26px;padding-top:20px}.smaller-projects h2{color:var(--cream);font:650 1.05rem/1.4 Host Grotesk,sans-serif;margin-bottom:8px}.smaller-projects .directory{font-size:.95rem}.smaller-projects a{scroll-margin-top:var(--project-scroll-margin, 100px)}.preview-column{align-self:stretch;min-width:0;padding-top:var(--preview-entry-space, 24px)}.project-preview{padding-right:10px;position:sticky;top:var(--preview-top, 100px)}.preview-frame{aspect-ratio:var(--preview-ratio, 1.5);background:var(--deep);border:12px solid var(--butter);box-shadow:0 14px 28px var(--shadow);max-height:var(--preview-height, 540px);overflow:hidden;position:relative;rotate:2deg;transition:aspect-ratio var(--motion)}.preview-frame img{height:calc(100% + 2px);top:-1px;right:-1px;bottom:-1px;left:-1px;object-fit:cover;object-position:top;position:absolute;width:calc(100% + 2px)}.preview-incoming{animation:preview-reveal var(--motion)}@keyframes preview-reveal{0%{opacity:0}to{opacity:1}}.contribution-note{animation:note-reveal .22s ease-out;background:var(--rose) var(--felt-light);background-size:220px;border:2px solid var(--rose-ink);border-radius:10px;box-shadow:0 8px 24px var(--shadow);color:var(--rose-ink);line-height:1.5;max-height:calc(100dvh - 24px);overflow:auto;padding:18px;position:fixed;z-index:60}.surface-dialog{animation:note-reveal var(--motion);border:2px solid var(--butter);color:var(--cream);margin:0;max-height:calc(100dvh - 32px);max-width:calc(100vw - 24px);overflow:auto;padding:18px;position:fixed}.surface-dialog::backdrop{background:#000a00cc}.surface-dialog.is-closing{animation:note-hide .16s ease-in both}.dialog-close{display:flex;margin:0 0 14px auto}.spotlight-note{background:var(--rose) var(--felt-light);background-size:220px;border:2px solid var(--rose-ink);border-radius:12px;box-shadow:0 10px 30px var(--shadow);color:var(--rose-ink);overflow:visible}.spotlight-note h2{color:inherit;font-size:1.45rem;margin-bottom:12px}.spotlight-note .dialog-close{background-color:var(--forest);color:var(--cream);outline-color:var(--butter)}.note-content{max-height:var(--note-content-height, calc(100dvh - 210px) );overflow-y:auto;overscroll-behavior:contain}.note-content .text-link{margin-top:12px}.spotlight-echo{align-items:center;background:var(--butter) var(--felt-light);background-size:220px;border-radius:6px;color:var(--butter-ink);display:flex;font-weight:650;padding:4px 6px;pointer-events:none;position:fixed}@keyframes note-reveal{0%{opacity:0}to{opacity:1}}@keyframes note-hide{0%{opacity:1}to{opacity:0}}.resume-intro h1{font-size:clamp(2.3rem,6vw,3.7rem);margin-bottom:12px}.role-line{font-size:clamp(1.1rem,2.8vw,1.5rem);font-weight:650}.resume-rail{align-items:center;display:flex;flex-wrap:wrap;gap:14px 24px;margin-top:24px}.print-site{display:none}.resume-tools{align-items:center;display:flex;flex-wrap:wrap;gap:16px;margin-bottom:28px}.lens-buttons{display:flex;flex-wrap:wrap;gap:10px}.field{background:var(--deep);border:2px solid var(--cream);border-radius:4px;color:var(--cream);min-height:48px;min-width:0;padding:10px 12px;width:100%}.field::placeholder{color:var(--cream);opacity:.75}.resume-search{flex:1;min-width:min(240px,100%)}.resume-stack{display:grid;gap:30px}.resume-job{display:grid;gap:14px 28px;grid-template-columns:170px minmax(0,1fr)}.job-dates{font-weight:650}.resume-job h3{font:650 clamp(1.12rem,2.4vw,1.3rem) / 1.3 "Host Grotesk",sans-serif}.job-company{font-weight:550;margin-top:6px}.resume-job ul{margin-top:12px;padding-left:20px}.resume-job li+li{margin-top:6px}mark{background:var(--butter);color:var(--butter-ink);padding:0 2px}.resume-directories{display:grid;gap:32px}.resume-directories h2{font-size:1.6rem;margin-bottom:12px}.skills-education{display:grid;gap:40px;grid-template-columns:1.5fr 1fr}.skills{display:grid;gap:12px 24px;grid-template-columns:auto minmax(0,1fr)}.skills dt{font-weight:650}.event-grid{display:grid;gap:34px 28px;grid-template-columns:repeat(3,minmax(0,1fr))}.event-link h2{color:var(--cream);font:750 clamp(1.25rem,2.8vw,1.6rem) / 1.2 "Host Grotesk",sans-serif;margin-bottom:8px}.event-year{font-size:1.4rem;font-weight:650;margin-top:-14px}.gallery-back{margin-block:24px 34px}.gallery{column-gap:24px;columns:2}.gallery-photo{background:transparent;border:5px solid var(--cream);break-inside:avoid;cursor:zoom-in;display:block;margin-bottom:24px;padding:0;width:100%}.gallery-photo img{height:auto;width:100%}.photo-viewer{background:var(--deep);inset:50% auto auto 50%;transform:translate(-50%,-50%);width:min(1200px,calc(100vw - 24px))}.photo-viewer img{height:min(70dvh,900px);object-fit:contain;width:100%}.photo-viewer figcaption{margin-block:12px}.photo-controls{display:flex;gap:16px}.guestbook-form{display:grid;gap:14px;max-width:640px}.form-pair{display:grid;gap:14px;grid-template-columns:1fr 1fr}.guestbook-form textarea{min-height:110px;resize:vertical}.guestbook-form>.patch{justify-self:start}.guestbook-results{min-height:120px}.guest-entry{display:grid;gap:18px;grid-template-columns:minmax(0,2fr) minmax(0,3fr);padding-block:24px}.guest-entry h2{color:var(--cream);font-size:clamp(1.45rem,3vw,2rem);overflow-wrap:anywhere}.guest-message{overflow-wrap:anywhere;white-space:pre-wrap}.guest-date{font-size:.9rem;margin-top:12px;opacity:.75}.spinner{animation:spin .9s linear infinite;border:3px solid var(--cream);border-radius:50%;border-top-color:transparent;display:inline-block;height:26px;width:26px}@keyframes spin{to{rotate:1turn}}@media (hover: hover){.patch:hover{translate:0 -2px}.project-tile:hover .tile-image img,.event-link:hover .tile-image img{scale:1.025}}@media (width < 1024px){.project-layout{display:flex;flex-direction:column;gap:20px}.preview-column{align-items:center;align-self:auto;background:var(--deep) var(--felt);display:flex;flex-shrink:0;height:var(--compact-height, 280px);isolation:isolate;justify-content:center;order:-1;padding:14px 8px 18px;position:sticky;top:var(--compact-top, 0);width:100%;z-index:20}.preview-column:before{background:var(--deep) var(--felt);background-size:220px;box-shadow:0 10px 14px var(--shadow);content:"";inset:0 calc(-1 * var(--gutter));position:absolute;z-index:-1}.project-preview{align-items:center;display:flex;height:100%;justify-content:center;padding:0;position:static;width:100%}.preview-frame{border-width:8px;max-height:var(--compact-image-height, 248px);transition:aspect-ratio var(--motion),width var(--motion);width:min(100%,calc(var(--compact-image-height, 248px) * var(--preview-ratio, 1.5)))}.project-list{width:100%}}@media (width < 680px){.site-header{position:relative}.menu-button{display:inline-flex}#primary-nav{display:none;width:100%}#primary-nav.is-open{display:block}.site-header ul{display:grid}.site-header li a{justify-content:flex-start;width:100%}.hero{grid-template-columns:1fr}.home-band{padding-top:calc(var(--space) + 6px)}.three-up,.skills-education{grid-template-columns:1fr}.three-up{gap:34px}.project-tile h3{font-size:1.6rem}.resume-job{grid-template-columns:1fr}.resume-rail{gap:10px 20px}.skills{grid-template-columns:1fr}.skills dd{margin-bottom:10px}.event-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.event-grid .tile-image{border-width:3px;margin-bottom:12px}.event-link h2{font-size:1.1rem}.gallery{columns:1}.guest-entry,.form-pair{grid-template-columns:1fr}}@media print{@page{margin:14mm;size:a4}:root{background:#fff;color:#000;font-size:10pt}.site-header,footer,.resume-tools,.print-button,.surface-dialog,.contribution-note{display:none!important}.band{background:none;color:#000;padding:10px 0}.band:after{display:none}h1,h2,.tone-butter h2{color:#000}h1{font-size:24pt!important}h2{font-size:16pt;margin-bottom:10px}.resume-stack{gap:16px}.resume-job{break-inside:avoid;gap:16px;grid-template-columns:95px 1fr}.resume-job h3{font-size:12pt}.resume-job ul{margin-top:6px}.resume-rail{margin-top:8px}.print-site{display:inline}.text-link{min-height:0}.directory{gap:2px 12px}.resume-directories,.skills-education{gap:16px}.skills{gap:6px 16px}}@keyframes content-arrive{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.section-inner>h1,.home-intro h1{animation:content-arrive var(--motion)}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation:none!important;scroll-behavior:auto!important;transition:none!important}}.wordmark{align-items:center;display:inline-flex;min-height:44px}.portrait-frame:focus-visible{outline:3px solid var(--cream);outline-offset:5px}.spotlight-note .patch:focus-visible{outline-color:var(--rose-ink)}.tone-butter .patch:focus-visible{outline-color:var(--butter-ink)}@media print{*,*:before,*:after{animation:none!important;transition:none!important}:root{font-size:9.5pt;line-height:1.35}.role-line{font-size:10.5pt}.resume-stack{gap:12px}.resume-job h3{font-size:11pt}.resume-job li+li{margin-top:3px}}@media print{html,body{overflow:visible!important}}
