@charset "UTF-8";
:root{color-scheme:dark;--bg:#02060c;--text:#f0f2f5;--muted:#929aa7;--line:rgba(187,209,239,.17);--ease:cubic-bezier(.22,1,.36,1);font-family:var(--font-ui);font-synthesis:none;background:var(--bg);color:var(--text)}
*{box-sizing:border-box}body{margin:0}button,a{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;border:0;background:none;cursor:pointer}a,button{touch-action:manipulation}button:focus-visible,a:focus-visible,summary:focus-visible{outline:1px solid #add5ff;outline-offset:8px}button:disabled{cursor:default}::selection{background:#2261a0;color:white}
.stage{position:relative;min-height:680px;height:100svh;overflow:hidden;isolation:isolate;background:#02060c}.scene{position:absolute;inset:0;z-index:-2;overflow:hidden}.portrait-wrap{position:absolute;z-index:0;inset:-2%;will-change:transform;transform:translate3d(var(--parallax-x,0px),var(--parallax-y,0px),0);animation:portrait-in 2.8s var(--ease) both}.portrait{position:absolute;width:100%;height:100%;object-fit:cover;object-position:50% 43%}.portrait-base{filter:brightness(.5) saturate(.8)}.portrait-reveal{filter:brightness(1.17) saturate(.92);mask-image:radial-gradient(ellipse 340px 340px at var(--light-x,58%) var(--light-y,46%),#000 0%,rgba(0,0,0,.8) 25%,transparent 100%);-webkit-mask-image:radial-gradient(ellipse 340px 340px at var(--light-x,58%) var(--light-y,46%),#000 0%,rgba(0,0,0,.8) 25%,transparent 100%)}
.vignette{position:absolute;z-index:4;inset:0;background:linear-gradient(90deg,rgba(0,2,5,.9),rgba(0,3,8,.4) 28%,transparent 48%,rgba(0,2,5,.12) 65%,rgba(0,2,5,.91)),linear-gradient(0deg,#02060c 0%,rgba(2,6,12,.2) 23%,transparent 55%,rgba(0,2,5,.2))}.grain{position:absolute;z-index:5;inset:0;opacity:.065;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='.92' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Cpath fill='%23fff' filter='url(%23n)' opacity='.65' d='M0 0h180v180H0z'/%3E%3C/svg%3E")}

.site-header{position:absolute;left:3.8%;right:3.8%;top:35px;display:flex;align-items:center;justify-content:space-between;animation:fade-in 1.8s .2s both}.wordmark{font-size:15px;letter-spacing:.47em;font-weight:500;display:inline-flex;align-items:center;gap:22px;padding:10px 0}.wordmark-line{width:23px;height:1px;background:#8793a3;opacity:.65}.menu-toggle{display:flex;gap:24px;align-items:center;font-size:12px;letter-spacing:.19em;padding:12px 0}.menu-dots{font-size:12px;letter-spacing:2px}.hero-copy{position:absolute;left:6%;top:38%;width:40%;animation:copy-in 1.7s .35s var(--ease) both}.eyebrow{font-size:11px;letter-spacing:.22em;font-weight:400;line-height:1.7}.intro-name{color:#a4adbb;margin:0 0 26px;letter-spacing:.32em}.title-space{position:relative}h1{font-size:clamp(31px,3.5vw,65px);font-weight:300;letter-spacing:.29em;line-height:1.3;margin:0;transition:opacity .4s,transform .6s var(--ease)}.short-rule{display:block;height:1px;width:41px;background:#a0a5ae;opacity:.5;margin:32px 0 23px}.location{color:#b3b7c0;font-size:10px;letter-spacing:.24em}.hover-preview{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;opacity:0;transform:translateY(15px);transition:opacity .4s,transform .6s var(--ease)}.preview-title{font-size:clamp(34px,4vw,70px);font-weight:300;letter-spacing:.02em;line-height:1.18;white-space:pre-line}.preview-caption{font-size:10px;letter-spacing:.22em;color:#b0bac8;margin-top:17px;line-height:1.8}.is-previewing h1{opacity:0;transform:translateY(-12px)}.is-previewing .hover-preview{opacity:1;transform:translateY(0)}
.hero-nav{position:absolute;right:8%;top:37%;display:flex;flex-direction:column;gap:8px;width:170px;animation:copy-in 1.7s .6s var(--ease) both}.hero-nav a{position:relative;display:flex;align-items:center;gap:14px;font-size:13px;font-weight:300;letter-spacing:.18em;padding:12px 0;color:#b3b7c1;transition:color .3s,transform .45s var(--ease)}.nav-index{position:absolute;right:calc(100% + 16px);font-size:9px;letter-spacing:.08em;color:#8798b1;opacity:0;transform:translateX(-6px);transition:opacity .3s,transform .3s}.nav-arrow{margin-left:auto;opacity:0;transform:translate(-5px,5px);transition:all .3s;font-size:17px;color:#b8d9ff}.hero-nav a:hover,.hero-nav a:focus-visible{color:#fff;transform:translateX(6px)}.hero-nav a:hover .nav-index,.hero-nav a:focus-visible .nav-index,.hero-nav a:hover .nav-arrow,.hero-nav a:focus-visible .nav-arrow{opacity:1;transform:translate(0)}.position-rail{position:absolute;right:3.8%;top:105px;bottom:105px;width:1px;background:linear-gradient(transparent,rgba(161,182,212,.16) 15%,rgba(161,182,212,.16) 85%,transparent);animation:fade-in 2s .8s both}.position-rail span{position:absolute;top:34%;left:-2px;width:5px;height:5px;background:#edf5ff;border-radius:50%;box-shadow:0 0 14px #b5dcff;transition:top .8s var(--ease)}
.explore-hint{position:absolute;left:49%;bottom:15%;display:flex;align-items:center;gap:15px;animation:fade-in 2s 1.2s both;transition:opacity .6s;pointer-events:none}.explore-hint>span:last-child{font-size:9px;letter-spacing:.15em;line-height:1.9;color:#bbc8db}.light-orbit{width:46px;height:46px;border:1px solid #809fbd88;border-radius:50%;display:grid;place-items:center}.light-orbit i{width:4px;height:4px;border-radius:50%;background:#e6f8ff;box-shadow:0 0 6px 2px #71c5ff,0 0 20px 9px #147cff,0 0 45px 17px #1465bc66;animation:breathe 3s ease-in-out infinite}.has-explored .explore-hint{opacity:0}.hero-footer{position:absolute;bottom:31px;left:3.8%;right:3.8%;display:flex;justify-content:space-between;align-items:center;font-size:9px;letter-spacing:.17em;color:#8c96a7;animation:fade-in 2s .8s both}.hero-footer i{font-style:normal;padding:0 8px;color:#738aa8}.footer-note{font-size:8px;letter-spacing:.22em;color:#677486}.footer-year{color:#5a697e;margin-left:9px}
dialog{border:0;color:var(--text);padding:0;background:#030810;max-width:none;max-height:none;width:100%;height:100%;margin:0;overflow:auto;overscroll-behavior:contain}dialog::backdrop{background:#02060cbb;backdrop-filter:blur(12px)}dialog[open]{animation:panel-in .7s var(--ease) both}dialog.is-closing{animation:panel-out .35s ease both}.dialog-top{padding:34px 5%;display:flex;align-items:center;justify-content:space-between;gap:25px}.close-button{font-size:10px;letter-spacing:.18em;display:flex;align-items:center;gap:22px;min-height:44px}.close-button span{font-size:30px;font-weight:300;color:#8eaccd}.menu-dialog{background:radial-gradient(ellipse at 80% 40%,#0d2542 0%,#030810 60%)}.expanded-nav{max-width:1040px;margin:5vh auto;padding:0 40px}.expanded-nav a{display:flex;align-items:center;gap:30px;font-size:clamp(32px,5vw,72px);font-weight:300;padding:14px 0;border-bottom:1px solid var(--line);transition:color .25s,padding .4s}.expanded-nav a:hover{color:#93c9ff;padding-left:15px}.expanded-nav span{font-size:11px;letter-spacing:.1em;color:#7991ab}.expanded-nav i{font-style:normal;font-size:12px;letter-spacing:.06em;color:#7f90a5;margin-left:auto;font-weight:400}.menu-email{display:block;max-width:960px;margin:45px auto;font-size:14px;color:#9db1c9}.section-dialog{background:radial-gradient(ellipse at 100% 0%,#0b203b,transparent 55%),#030810}.section-content{max-width:1200px;margin:50px auto 85px;padding:0 55px;min-height:55vh}.section-kicker{color:#839bb6;margin-bottom:25px}.section-heading{font-weight:300;font-size:clamp(44px,6vw,88px);letter-spacing:-.04em;line-height:1.08;margin:0 0 32px;max-width:850px}.section-lead{font-size:clamp(16px,1.4vw,20px);font-weight:300;line-height:1.8;color:#a7b3c2;max-width:650px;margin:0 0 50px}.section-bottom{border-top:1px solid var(--line);display:flex;gap:30px;margin:0 5%;padding:26px 0 34px;font-size:12px;letter-spacing:.08em;color:#8d9bb0;flex-wrap:wrap}.section-bottom a[aria-current=page]{color:#f0f5ff}.collaboration-list{margin-top:45px}.work-entry{border-top:1px solid var(--line)}.work-entry:last-child{border-bottom:1px solid var(--line)}.work-entry summary{list-style:none;cursor:pointer;padding:25px 0;display:flex;align-items:center;gap:25px}.work-entry summary::-webkit-details-marker{display:none}.entry-number{font-size:10px;color:#61758d}.work-entry h3{font-weight:300;font-size:25px;margin:0;flex:1}.entry-discipline{font-size:11px;letter-spacing:.06em;color:#8a9cb3}.entry-plus{font-size:25px;font-weight:300;margin-left:20px;transition:transform .3s}.work-entry[open] .entry-plus{transform:rotate(45deg)}.work-entry p{font-size:16px;line-height:1.8;font-weight:300;color:#a7b3c2;max-width:720px;padding:0 0 28px 40px;margin:0}.experience-row{display:grid;grid-template-columns:1fr 1.5fr;gap:50px;border-top:1px solid var(--line);padding:28px 0}.experience-row h3{font-size:23px;font-weight:300;margin:0 0 10px}.experience-row .role{font-size:12px;color:#7e96b2;line-height:1.6}.experience-row p{font-size:16px;color:#a7b3c2;line-height:1.8;margin:0;font-weight:300}.practice-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 50px}.practice{padding:28px 0;border-top:1px solid var(--line)}.practice .eyebrow{color:#5f83ac}.practice h3{font-size:25px;font-weight:300;margin:16px 0}.practice p{font-size:16px;line-height:1.8;color:#9aabbe;font-weight:300}.about-grid{display:grid;grid-template-columns:1.4fr 1fr;gap:80px}.about-grid p{font-size:17px;line-height:1.8;color:#a7b3c2;font-weight:300}.about-grid h3{font-size:11px;letter-spacing:.2em;color:#839bb6;font-weight:400;margin:25px 0 15px}.skill-list{display:flex;flex-wrap:wrap;gap:9px}.skill-list span{border:1px solid var(--line);padding:9px 12px;font-size:12px;color:#adbdd0}.text-link{display:inline-flex;gap:28px;padding:15px 0;border-bottom:1px solid #577493;font-size:13px;letter-spacing:.06em;transition:color .3s}.text-link:hover{color:#8fc8ff}.contact-email{display:inline-block;font-size:clamp(20px,3.8vw,52px);font-weight:300;letter-spacing:-.025em;padding:15px 0 25px;border-bottom:1px solid #355575;overflow-wrap:anywhere;transition:color .3s}.contact-email:hover{color:#8bc8ff}.contact-links{display:flex;gap:35px;margin-top:45px;flex-wrap:wrap}.contact-note{font-size:12px;letter-spacing:.1em;color:#7791ae;margin-top:60px}.noscript-note{position:fixed;bottom:70px;left:5%;right:5%;background:#030810;padding:20px;z-index:8}.noscript-note a{text-decoration:underline}
@keyframes fade-in{from{opacity:0}to{opacity:1}}@keyframes copy-in{from{opacity:0;transform:translateY(22px)}to{opacity:1;transform:translateY(0)}}@keyframes portrait-in{from{opacity:0;scale:1.045}to{opacity:1;scale:1}}@keyframes breathe{50%{opacity:.6;scale:.8}}@keyframes panel-in{from{opacity:0;transform:translateY(25px)}to{opacity:1;transform:translateY(0)}}@keyframes panel-out{to{opacity:0;transform:translateY(20px)}}
.has-explored .explore-hint{animation:none;opacity:0}
@media(min-width:1800px){.hero-copy{left:8%}.hero-nav{right:9%}}
@media(max-width:1000px){.hero-copy{left:6%;width:49%}h1{font-size:clamp(29px,4.6vw,47px);letter-spacing:.2em}.hero-nav{right:7%;width:145px}.hero-nav a{font-size:12px}.portrait{object-position:53% 50%}.vignette{background:linear-gradient(90deg,#02060ce8,transparent 70%,#02060cb0),linear-gradient(0deg,#02060c,transparent 45%)}.footer-note{display:none}.explore-hint{left:46%;bottom:17%}.entry-discipline{max-width:180px;line-height:1.6}.menu-email{margin-left:40px}}
@media(max-width:600px){.stage{height:100svh;min-height:740px}.site-header{top:20px;left:25px;right:25px}.wordmark{font-size:13px}.wordmark-line{display:none}.menu-toggle{font-size:10px;gap:16px}.portrait-wrap{inset:0 0 12%;transform:none!important}.portrait{object-position:43% 20%}.portrait-base{filter:brightness(.62) saturate(.8)}.portrait-reveal{mask-image:radial-gradient(circle at 65% 38%,#0008,transparent 60%)}.vignette{background:linear-gradient(0deg,#02060c 18%,#02060cf2 29%,#02060c55 59%,transparent 80%),linear-gradient(90deg,#02060c77,transparent 70%)}.hero-copy{left:28px;top:auto;bottom:230px;width:calc(100% - 56px)}.intro-name{font-size:9px;margin-bottom:17px}.title-space h1{font-size:clamp(31px,8.4vw,45px);letter-spacing:.22em;line-height:1.3}.short-rule{margin:21px 0 15px;width:32px}.location{font-size:9px}.hero-nav{top:auto;bottom:90px;left:28px;right:28px;width:auto;display:grid;grid-template-columns:1fr 1.25fr 1fr;gap:0 15px;border-top:1px solid var(--line);padding-top:14px}.hero-nav a{padding:13px 0;font-size:10px;letter-spacing:.15em}.nav-index{position:static;font-size:8px;opacity:.6;transform:none}.nav-arrow{display:none}.hero-nav a:hover{transform:none}.hero-footer{bottom:28px;left:28px;right:28px;font-size:7px;letter-spacing:.1em;gap:15px}.hero-footer i{padding:0 4px}.footer-year{margin-left:3px}.position-rail,.explore-hint,.hover-preview{display:none}.is-previewing h1{opacity:1;transform:none}.dialog-top{padding:20px 25px}.close-button{font-size:9px;gap:12px}.dialog-top .eyebrow{font-size:9px}.expanded-nav{padding:0 27px;margin:7vh 0 35px}.expanded-nav a{font-size:39px;gap:17px;padding:21px 0}.expanded-nav i{display:none}.menu-email{margin-left:27px;font-size:13px}.section-content{margin:45px auto 55px;padding:0 27px}.section-heading{font-size:48px}.section-lead{font-size:16px;margin-bottom:35px}.section-kicker{font-size:10px}.work-entry summary{gap:13px;flex-wrap:wrap;padding:24px 0}.work-entry h3{font-size:22px;flex-basis:70%}.entry-discipline{margin-left:28px;order:3;max-width:none;font-size:10px}.entry-plus{margin-left:auto;font-size:22px}.work-entry p{padding-left:28px;font-size:15px}.experience-row{grid-template-columns:1fr;gap:16px;padding:27px 0}.experience-row p{font-size:15px}.practice-grid,.about-grid{grid-template-columns:1fr;gap:10px}.about-grid p{font-size:16px}.section-bottom{gap:20px;margin:0 27px;font-size:10px}.contact-email{font-size:24px}.contact-links{gap:25px}.contact-note{line-height:1.8}.text-link{font-size:12px}}
@media(pointer:coarse){.explore-hint{display:none}.portrait-reveal{mask-image:radial-gradient(circle at 60% 40%,#0009,transparent 65%)}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}.portrait-wrap{transform:none!important}.explore-hint{display:none}}

/* A static photograph remains available while geometry loads or if WebGL2
   cannot run. The moving source is rendered only by the 3D scene. */
.portrait-lighting{position:absolute;inset:0;width:100%;height:100%;opacity:0;pointer-events:none}
.portrait-lighting.is-ready{opacity:1}
.portrait-base{filter:brightness(.58) saturate(.88)}
.portrait-reveal{display:none}
.vignette{opacity:.38}
.has-explored .portrait-wrap{animation:none}
/* Lift edge shading around the exact pointer, including clipped corners. */
.cursor-active .vignette{mask-image:radial-gradient(circle 420px at var(--cursor-x) var(--cursor-y),transparent 0%,transparent 15%,#000 100%);-webkit-mask-image:radial-gradient(circle 420px at var(--cursor-x) var(--cursor-y),transparent 0%,transparent 15%,#000 100%)}
@media(max-width:600px){.vignette{opacity:.9}}
/* The 3D renderer owns depth and movement; CSS never translates its light away
   from the pointer. The photograph is retained only as a GPU/load fallback. */
.scene:has(.portrait-lighting.is-ready) .portrait-wrap{inset:0;transform:none;animation:none}
.scene:has(.portrait-lighting.is-ready) .portrait-base,
.scene:has(.portrait-lighting.is-ready) .portrait-reveal{visibility:hidden}
.scene:has(.portrait-lighting.is-ready) .vignette{opacity:.18}
.scene:has(.portrait-lighting.is-ready) .grain{opacity:.035}
@media(max-width:600px){.portrait{object-position:38.5% 20%}}
@media(max-width:600px){.scene:has(.portrait-lighting.is-ready) .portrait-wrap{inset:0 0 12%}.scene:has(.portrait-lighting.is-ready) .vignette{opacity:1}}
