:root{--serif:Georgia,'Times New Roman',serif;--sans:Georgia,'Times New Roman',serif;--paper:#f5efdf;--ink:#342b20;--muted:#817764;--accent:#6e634f}
body{font-family:Georgia,'Times New Roman',serif}header{height:78px;border:0;padding:0 3%;justify-content:flex-end;gap:40px}.wordmark{font-size:16px;letter-spacing:0;margin-right:auto}nav{font-size:13px;gap:27px;color:var(--muted)}nav a:hover{color:var(--ink)}
.intro{position:relative;isolation:isolate;min-height:calc(100svh - 78px);padding:10px 24px 0;display:flex;flex-direction:column;justify-content:space-between}.intro:after{content:'';position:absolute;z-index:-1;bottom:0;left:0;right:0;height:max(220px,33.333333vw);background:url('assets/yosemite-landscape.png') center bottom / 100% auto no-repeat;opacity:.7;mask-image:linear-gradient(to bottom,transparent,black 15%);-webkit-mask-image:linear-gradient(to bottom,transparent,black 15%);pointer-events:none}.hero-grid{display:block;flex:0;width:100%;max-width:630px;margin:0 auto;padding:25px 0 180px}.bio{padding:0;max-width:none}.bio p{font-family:Georgia,'Times New Roman',serif;font-size:20px;line-height:1.85;margin-bottom:36px}.bio>.text-link{display:none}.home-links{display:flex;justify-content:center;gap:90px;padding:18px 0 20px;color:#746953;font-size:12px}.home-links a{padding:8px 0}.section-wrap{max-width:850px;margin:auto;padding-left:35px;padding-right:35px}.work{padding-top:90px;padding-bottom:50px}.section-heading{margin-bottom:35px}h2,.outside-intro h2,footer h2{font:normal 25px Georgia,serif;letter-spacing:0;margin:0}h3{font:normal 20px Georgia,serif}.experience article{grid-template-columns:115px 1fr;gap:25px;padding:27px 0;border-color:#e2d9c7}.row-number{display:none}.when{font-size:10px;letter-spacing:0;font-weight:400}.role{font-size:12px;color:var(--muted);margin:9px 0 14px}.experience p{font-size:15px;line-height:1.8}.detail{font-size:11px;line-height:1.8}.resume-row{font-size:13px}.text-link{font-size:13px;gap:15px}.outside-intro{padding-top:65px;padding-bottom:25px;text-align:left}.outside-intro p{font-size:15px;line-height:1.7;margin-top:18px}.chapter-title{font-family:Arial,sans-serif;font-weight:400;color:#e5ddce;font-size:12vw;letter-spacing:-.05em}.photo{border:0;box-shadow:none;rotate:0deg!important}.photo-label{font:16px Georgia,serif}.photo-note{letter-spacing:1px}.photo svg{opacity:.4}.chapter-tabs button{font:13px Georgia,serif}.journey-footer{font-size:12px}.email{font:16px Georgia,serif;margin:0}.footer-links{padding:0;flex-direction:row;gap:25px;font-size:12px}footer.section-wrap{padding-top:40px;padding-bottom:25px;gap:35px}.colophon{font-size:11px;padding-top:20px}.eyebrow{display:none}
@media(min-width:1600px){.intro{padding-left:24px;padding-right:24px}.hero-grid{padding-top:30px}}
@media(max-width:700px){header{padding:0 6%;height:70px;gap:15px}.wordmark{font-size:14px}nav{gap:14px;font-size:11px}nav a:nth-child(3){max-width:none}.intro{min-height:calc(100svh - 70px);padding:20px 7% 0}.hero-grid{padding:15px 0 150px}.bio p{font-size:18px;line-height:1.85;margin-bottom:28px}.intro:after{height:240px;background-size:auto 240px;background-position:24% bottom}.home-links{gap:35px;font-size:11px;padding-bottom:20px}.section-wrap{padding-left:7%;padding-right:7%}.work{padding-top:60px}.experience article{grid-template-columns:1fr;gap:9px}.when{font-size:10px}.experience p{font-size:15px}.detail{font-size:11px}.outside-intro h2{font-size:25px}.outside-intro p{font-size:14px}.photo-label{font-size:14px}.chapter-tabs button{font-size:12px}.chapter-count{font-size:10px}footer.section-wrap{display:flex;flex-wrap:wrap;gap:25px}.colophon{width:100%}}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}


/* The first scroll holds the two sections in place and dissolves between them. */
.scene-transitions .home-scene{position:relative;height:calc(var(--home-height) + var(--scene-distance))}
.scene-transitions .home-scene .intro{position:sticky;top:0;will-change:opacity,transform}
.scene-transitions .work{position:relative;z-index:2;margin-top:calc(-1 * var(--home-height));will-change:opacity,transform}
.experience{position:relative}
.experience article{position:relative}
.experience article:before{content:'';position:absolute;left:126px;top:37px;bottom:-38px;width:1px;background:var(--line)}
.experience article:after{content:'';position:absolute;left:123px;top:35px;width:7px;height:7px;border-radius:50%;background:#9c8d73;box-shadow:0 0 0 4px var(--paper)}
.experience article:last-child:before{bottom:30px}
@media(max-width:700px){.experience article{padding-left:20px}.experience article:before{left:1px;top:34px;bottom:-34px}.experience article:after{left:-2px;top:32px}.experience article:last-child:before{bottom:30px}}
@media(prefers-reduced-motion:reduce){.scene-transitions .home-scene{height:auto}.scene-transitions .home-scene .intro{position:relative;will-change:auto}.scene-transitions .work{margin-top:0;will-change:auto}}

/* Keep the same valley visible as the camera approaches the granite wall. */
body{isolation:isolate}
.cliff-scene{position:fixed;inset:0;z-index:-1;overflow:hidden;pointer-events:none;opacity:0}
.cliff-image{position:absolute;inset:0;background:url('assets/yosemite-landscape.png') center bottom / 100% auto no-repeat;transform-origin:22% 86%;will-change:transform;mask-image:linear-gradient(transparent 12%,#000 55%)}
.cliff-wash{position:absolute;inset:0;background:var(--paper);opacity:0}
.scene-transitions .intro:after{display:none}
.scene-transitions .home-scene .intro{will-change:auto}
.scene-transitions .bio p{transform-origin:left center;will-change:transform,opacity}
.scene-transitions .work{text-shadow:0 1px 0 #fff9}
.scene-transitions .experience article{border-top:0;will-change:transform,opacity}
.scene-transitions .experience article:before{background:#8b7b61;transform:scaleY(var(--route-reveal,0));transform-origin:top;box-shadow:1px 0 0 #fff8}
.scene-transitions .experience article:after{background:var(--paper);border:1px solid #75644d;box-shadow:0 0 0 3px #f5efdf88,inset 0 1px 2px #77654a55}
.scene-transitions .experience h3{color:#433a2b;text-shadow:0 1px 0 #fffc,0 -1px 0 #56452b22}
.outside,footer{position:relative;background:var(--paper)}
@media(max-width:700px){.cliff-image{background-size:auto 45svh;background-position:24% bottom;transform-origin:28% 88%}}
@media(prefers-reduced-motion:reduce){.cliff-scene{display:none}}

.text-bridge{position:fixed;z-index:4;pointer-events:none;font:20px/1.85 Georgia,serif;color:var(--ink);opacity:0;transform-origin:left top;white-space:nowrap}
@media(max-width:700px){.text-bridge{font-size:18px}}
@media(prefers-reduced-motion:reduce){.text-bridge{display:none}}

/* A dedicated frontal plate preserves granite detail instead of enlarging the valley. */
.cliff-front{position:absolute;inset:0;background:url('assets/el-capitan-front.png') center 44% / cover no-repeat;opacity:0;transform-origin:50% 48%;will-change:transform,opacity}
.cliff-image{transform-origin:24% 74%}
.scene-transitions .work{max-width:800px;color:#4c4234}
.scene-transitions .experience p{color:#4c4234;text-shadow:0 1px 0 #ffffffe0,0 -1px 1px #3e2d1720}
.scene-transitions .experience h3{color:#574a37;text-shadow:0 1px 0 #fff,0 -1px 1px #35250c80;letter-spacing:.015em}
.scene-transitions .when,.scene-transitions .role,.scene-transitions .detail{color:#685940;text-shadow:0 1px 0 #ffffffd9}
.scene-transitions .experience article:before{display:none}
.climbing-route{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}
.climbing-route path{fill:none;stroke:#7e6c50;stroke-width:1.3;stroke-dasharray:3 4;filter:drop-shadow(1px 1px 0 #fff9)}
.scene-transitions .experience article:after{width:8px;height:8px;background:#ab9876;border:1px solid #665336;box-shadow:0 1px 0 #fff9,inset 0 1px 2px #423320aa}
@media(max-width:700px){.cliff-front{background-size:auto 112%;background-position:50% 45%}.scene-transitions .work{padding-left:9%;padding-right:9%}}
@media(prefers-reduced-motion:reduce){.climbing-route{display:none}}

/* A three-plane camera move with a near ridge passing faster than the distant wall. */
.cliff-approach{position:absolute;inset:-5%;background:url('assets/el-capitan-approach.png') center / cover no-repeat;opacity:0;transform-origin:45% 55%;will-change:transform,opacity;backface-visibility:hidden}
.cliff-front{inset:5vh 5vw;background-size:contain;background-position:center;transform-origin:50% 50%;backface-visibility:hidden;mask-image:linear-gradient(to bottom,transparent,#000 3%,#000 95%,transparent)}
.cliff-foreground{position:absolute;inset:0;background:url('assets/yosemite-foreground.png') left bottom / cover no-repeat;transform-origin:18% 80%;opacity:0;will-change:transform,opacity}
.scene-transitions .work{max-width:730px;padding-top:16vh}
@media(max-width:700px){.cliff-approach{background-position:43% center}.cliff-front{inset:7vh 0;background-size:auto 86%;background-position:50% center}.cliff-foreground{background-position:25% bottom}.scene-transitions .work{padding-top:15vh}}

.cliff-front{mask-image:linear-gradient(to right,transparent,#000 6%,#000 94%,transparent),linear-gradient(to bottom,transparent,#000 3%,#000 94%,transparent);mask-composite:intersect}


.flight-canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.flight-3d-ready .cliff-image{display:none}
.flight-unavailable .flight-canvas{display:none}

.flight-canvas{opacity:.62}
.flight-3d-ready .work{max-width:630px}
.flight-3d-ready .experience p{color:#342b20;text-shadow:none}
.flight-3d-ready .experience h3{color:#3c3121;text-shadow:0 1px 0 #ffffff90}
.flight-3d-ready .when,.flight-3d-ready .role,.flight-3d-ready .detail{color:#514633;text-shadow:none}

/* Illustration at rest, restrained depth only while travelling between views. */
.cliff-scene .cliff-image{display:block;z-index:2}
.cliff-scene .flight-canvas{z-index:1;opacity:0;mask-image:linear-gradient(transparent,#000 25%,#000 80%,transparent)}
.cliff-scene .cliff-front{z-index:3}
.cliff-scene .cliff-wash{z-index:4}

/* Simple center zoom: the mountains leave the viewport without fading. */
.cliff-scene .cliff-image{transform-origin:50% 25%;opacity:.7;will-change:transform}
.scene-transitions .work{max-width:730px;text-shadow:none}
.scene-transitions .experience p{color:var(--ink);text-shadow:none}
.scene-transitions .experience h3,.scene-transitions .when,.scene-transitions .role,.scene-transitions .detail{text-shadow:none}

.bridge-source{display:inline-block}
/* Feather the actual image boundary, rather than the full viewport above it. */
.cliff-scene .cliff-image{background:none;mask-image:none;-webkit-mask-image:none}
.cliff-scene .cliff-image:before{content:'';position:absolute;bottom:0;left:0;width:100%;height:33.333333vw;background:url('assets/yosemite-landscape.png') center bottom / 100% 100% no-repeat;mask-image:linear-gradient(transparent,#000 20%);-webkit-mask-image:linear-gradient(transparent,#000 20%)}
@media(max-width:700px){.cliff-scene .cliff-image:before{height:45svh;background-size:auto 100%;background-position:24% bottom}}

/* Photo placeholders unfold as the section arrives; real photos use the same motion. */
.photo-stage{transform-origin:50% 45%;will-change:transform}
.outside-intro{will-change:transform}
@media(prefers-reduced-motion:reduce){.photo-stage,.outside-intro{will-change:auto;transform:none!important}}

@font-face{font-family:'DM Sans';font-style:normal;font-weight:400;font-display:swap;src:url('assets/fonts/dm-sans-regular.ttf') format('truetype')}
@font-face{font-family:'DM Sans';font-style:normal;font-weight:500;font-display:swap;src:url('assets/fonts/dm-sans-medium.ttf') format('truetype')}
@font-face{font-family:'Lora';font-style:normal;font-weight:400;font-display:swap;src:url('assets/fonts/lora-regular.ttf') format('truetype')}
:root{--serif:'Lora',Georgia,serif;--sans:'DM Sans',system-ui,sans-serif}
body,nav,.wordmark,.home-links,.experience,.resume-row,.text-link,.outside-intro p,.journey-footer,.footer-links,.colophon{font-family:var(--sans)}
.wordmark{font-weight:500;letter-spacing:-.03em}
.bio p,.text-bridge{font-family:var(--serif);line-height:1.85;letter-spacing:-.02em}
h2,.outside-intro h2,footer h2{font-family:var(--serif);font-size:26px;letter-spacing:-.035em}
h3{font-family:var(--sans);font-size:20px;font-weight:500;letter-spacing:-.025em!important}
.when{font-size:10px;letter-spacing:.04em}
.role{font-size:12px}.experience p{line-height:1.8;font-size:15px}.detail{font-size:11px}
.photo-label,.chapter-tabs button,.email{font-family:var(--sans)}
.chapter-title{font-family:var(--sans);font-weight:500;letter-spacing:-.065em}
.photo-note{text-align:center;font:9px var(--sans);letter-spacing:.06em;padding:0 10px}
.photo.video-card{background:#292820;overflow:hidden;gap:0}
.photo video{display:block;width:100%;height:100%;object-fit:contain}

/* Clear chapter titles sit above the media, rather than behind it. */
.chapter-title{inset:auto 20px auto;top:6%;display:block;text-align:center;font:400 clamp(25px,3vw,36px)/1.2 var(--serif);letter-spacing:-.025em;color:#665b49;white-space:normal;z-index:1}
.photo-stage{inset:18% 8% 15%}
/* A single sage bouldering route; the text stays aligned alongside it. */
.experience article{grid-template-columns:90px 1fr;column-gap:80px;padding-top:29px;padding-bottom:34px}
.experience article:before{display:none}
.experience article:after,.scene-transitions .experience article:after{left:calc(var(--hold-x,112px) - 9px);top:32px;width:18px;height:14px;border:0;border-radius:44% 55% 38% 48%;background:#8c9780;clip-path:polygon(8% 35%,30% 4%,68% 0,100% 38%,86% 83%,46% 100%,0 74%);box-shadow:inset 0 2px 1px #c4cbb4,inset 0 -3px 1px #56614c66;transform:rotate(-16deg)}
.experience article:nth-of-type(2):after{transform:rotate(22deg);border-radius:35% 60% 45% 30%}
.experience article:nth-of-type(3):after{transform:rotate(-30deg)}
.experience article:nth-of-type(4):after{transform:rotate(12deg)}
.climbing-route path{stroke:#a4a792;stroke-width:1.4;stroke-dasharray:2 6;stroke-linecap:round;filter:none}
@media(max-width:700px){.experience article{grid-template-columns:1fr;gap:9px;padding-left:44px}.experience article:after,.scene-transitions .experience article:after{top:29px;width:16px;height:13px;left:calc(var(--hold-x,12px) - 8px)}.chapter-title{top:6%;font-size:27px}.photo-stage{inset:17% 4% 16%}}

/* Larger sculpted holds replace the small polygon markers. */
.experience article:after,.scene-transitions .experience article:after{display:none}
.route-hold{position:absolute;width:38px;height:38px;left:calc(var(--hold-x,116px) - 19px);top:20px;pointer-events:none;filter:drop-shadow(0 2px 1px #43513826);transform:rotate(-12deg);z-index:1}
.experience article:nth-of-type(2) .route-hold{transform:rotate(18deg)}
.experience article:nth-of-type(3) .route-hold{transform:rotate(-22deg)}
.experience article:nth-of-type(4) .route-hold{transform:rotate(10deg)}
@media(max-width:700px){.route-hold{width:32px;height:32px;left:calc(var(--hold-x,12px) - 16px);top:20px}}

.photo:has(img),.photo.video-card{background:transparent}

/* Media floats directly on the page, without placeholder-colored mats. */
.photo-stage .photo:nth-child(n){background:transparent;border:0;box-shadow:none}
.photo-stage .photo video{background:transparent}
.gallery-playback{position:absolute;right:5.4%;bottom:76px;z-index:2;border:0;border-bottom:1px solid #b3aa97;background:transparent;padding:5px 0;color:var(--muted);font:12px var(--sans);cursor:pointer}
.gallery-playback[hidden]{display:none}
@media(max-width:700px){.gallery-playback{right:6%;bottom:68px;font-size:11px}}

/* Larger media: four generous columns on desktop, two rows on phones. */
.photo-stage{inset:15% 3% 16%}
.photo-stage .photo:nth-child(1){width:23.5%;height:92%;left:0;top:4%}
.photo-stage .photo:nth-child(2){width:23.5%;height:88%;left:25.5%;top:0}
.photo-stage .photo:nth-child(3){width:23.5%;height:94%;left:51%;top:3%}
.photo-stage .photo:nth-child(4){width:23.5%;height:88%;left:76.5%;top:8%}
@media(max-width:700px){
 .photo-stage{inset:14% 4% 16%}
 .photo-stage .photo:nth-child(1){width:48%;height:48%;left:0;top:0}
 .photo-stage .photo:nth-child(2){width:48%;height:48%;left:52%;top:0}
 .photo-stage .photo:nth-child(3){width:48%;height:48%;left:0;top:52%}
 .photo-stage .photo:nth-child(4){width:48%;height:48%;left:52%;top:52%}
}

/* Overlapping, persistent chapters move gently through the same gallery. */
.chapter-layer{position:absolute;inset:0;pointer-events:none}
.chapter-layer .photo{will-change:transform,opacity;transition:none}
@media(prefers-reduced-motion:reduce){.chapter-layer .photo{will-change:auto}}

/* A quiet, personal page after the photo chapters. */
.fun-facts{position:relative;min-height:85svh;display:grid;align-items:center;padding:100px 7% 120px}
.fun-facts-inner{width:100%;max-width:640px;margin:0 auto}
.fun-facts h2{font:400 clamp(26px,3vw,34px)/1.25 var(--serif);letter-spacing:-.035em;margin:0 0 36px}
.fun-facts ul{margin:0;padding-left:20px;display:grid;gap:21px}
.fun-facts li{padding-left:9px;font:400 16px/1.8 var(--sans);color:var(--ink)}
.fun-facts li::marker{color:#8c9780;font-size:.75em}
@media(max-width:700px){.fun-facts{min-height:auto;padding:75px 8% 90px}.fun-facts h2{margin-bottom:28px}.fun-facts ul{gap:18px}.fun-facts li{font-size:15px;padding-left:5px}}
