:root{--paper:#eeeee7;--ink:#253326;--muted:#667061;--line:#ccd1c4;--lime:#d6e8a8;--serif:Georgia,'Times New Roman',serif}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:95px}body{margin:0;background:var(--paper);color:var(--ink);font:16px/1.65 Arial,Helvetica,sans-serif}a{color:inherit;text-underline-offset:5px}img{max-width:100%;display:block}button{font:inherit;color:inherit;cursor:pointer}button,a{-webkit-tap-highlight-color:transparent}a:focus-visible,button:focus-visible,video:focus-visible{outline:3px solid #b45b36;outline-offset:5px}::selection{background:var(--lime)}.wrap{width:min(1320px,90%);margin-inline:auto}.skip{position:fixed;top:-100px;left:15px;z-index:100;background:var(--ink);color:white;padding:12px}.skip:focus{top:10px}header{position:sticky;top:0;z-index:20;background:#eeeeE7f2;backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}nav{height:83px;display:flex;justify-content:space-between;align-items:center;gap:24px}.brand{font-weight:800;font-size:25px;letter-spacing:-1.3px;text-decoration:none}.brand span{color:#879f5d}.nav-links{display:flex;gap:35px;font-size:12px}.nav-links a,.nav-contact{text-decoration:none}.nav-links a:hover,.nav-contact:hover{text-decoration:underline}.nav-contact{font-size:12px;border-bottom:1px solid;padding-bottom:4px}.eyebrow{display:block;font:10px/1.8 monospace;letter-spacing:1.6px;text-transform:uppercase}.hero{padding-top:45px}.hero-top{display:flex;justify-content:space-between;gap:20px}.status:before{content:'';width:7px;height:7px;border-radius:50%;background:#718b45;display:inline-block;margin-right:9px}.hero-grid{display:grid;grid-template-columns:1fr 1fr;gap:7%;align-items:center;padding:47px 0 55px}h1,h2,h3,p{margin-top:0}h1{font-size:clamp(58px,6.8vw,98px);line-height:1.01;font-weight:500;letter-spacing:-5px;margin-bottom:28px}h1 em{font-family:var(--serif);font-weight:400}p{margin-bottom:20px}.hero-grid p{max-width:440px;font-size:17px}.muted{color:var(--muted);font-size:15px!important}.button{display:inline-flex;align-items:center;gap:45px;padding:13px 20px;border:1px solid var(--ink);font-size:12px;text-decoration:none;margin-top:10px}.dark{background:var(--ink);color:var(--paper)}.button:hover{background:var(--lime);color:var(--ink)}.hero-photo{position:relative;display:block;aspect-ratio:1.06;background:#d2d6c9;overflow:hidden}.hero-photo img{width:100%;height:100%;object-fit:cover;object-position:center}.photo-label,.photo-index{position:absolute;font:9px monospace;letter-spacing:1px;background:var(--paper);padding:9px 12px;bottom:16px;left:16px}.photo-index{bottom:auto;top:16px}.hero-foot{padding:21px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);display:flex;justify-content:space-between;gap:25px;font:10px/1.8 monospace}.hero-foot a{text-decoration:none}.section-heading{padding:95px 0 55px;display:flex;align-items:end;justify-content:space-between;gap:40px}h2{font-size:clamp(34px,4.3vw,60px);line-height:1.08;letter-spacing:-2.3px;font-weight:500;margin-bottom:24px}.section-heading h2{margin:15px 0 0}.section-heading>p{max-width:330px;color:var(--muted);font-size:14px;margin:0}.project-band{padding:55px 0;border-top:1px solid var(--line)}.project-band:nth-of-type(2n){background:#e4e8dc}.project-layout{display:grid;grid-template-columns:1.2fr 1fr;gap:8%;align-items:center}.reverse .project-picture{order:2}.reverse .project-copy{order:1}.project-picture{position:relative;display:block;text-decoration:none;overflow:hidden;background:#dce2d2}.project-picture>img{width:100%;aspect-ratio:1.35;object-fit:cover;transition:transform .5s}.project-picture:hover>img{transform:scale(1.025)}.picture-caption{position:absolute;bottom:14px;left:15px;right:15px;display:flex;justify-content:space-between;align-items:center;color:var(--ink);background:#eeeee7eb;padding:7px 10px;font:9px monospace;letter-spacing:1px}.picture-caption span{font-size:18px}.project-copy h2{margin:18px 0 21px;font-size:clamp(30px,3.5vw,49px)}.project-copy h2 a{text-decoration:none}.project-copy>p{color:var(--muted);font-size:15px;max-width:440px}.role{font-size:12px;border-top:1px solid var(--line);padding-top:16px;margin-top:25px}.role>span{display:block;font:9px monospace;letter-spacing:1px;color:var(--muted);margin-bottom:7px}.text-link{display:flex;width:max-content;gap:45px;font-size:12px;margin-top:27px;text-decoration:none;border-bottom:1px solid;padding-bottom:6px}.text-link:hover{color:#657b40}.compact{padding:35px 0}.compact .project-picture img{aspect-ratio:1.8}.compact h2{font-size:35px}.compact .project-layout{gap:8%}.about{padding:100px 0;background:var(--ink);color:var(--paper)}.about-grid{display:grid;grid-template-columns:1fr 1fr;gap:9%}.about h2{margin-top:20px}.about p{color:#c9d1c1;font-size:15px}.about .lead{font-size:21px;color:var(--paper)}.journey{font:11px monospace;display:flex;gap:25px;margin-top:45px}.journey span{color:var(--lime)}.about-note{border-top:1px solid #5b6754;margin-top:30px;padding-top:25px}.about-note h3{font:22px/1.3 var(--serif);color:var(--lime)}.skills{display:flex;gap:8px;flex-wrap:wrap;margin-top:28px}.skills span{font:10px monospace;padding:7px 10px;border:1px solid #5b6754}.contact{background:var(--lime);padding:65px 0}.contact h2{font-size:clamp(40px,5.5vw,75px);margin:20px 0 35px}.contact-links{display:flex;flex-wrap:wrap;gap:25px 45px;font-size:14px}.contact-links a{text-decoration:none;border-bottom:1px solid;padding-bottom:5px}footer{display:flex;justify-content:space-between;gap:20px;padding:26px 0;font:10px/1.8 monospace;color:var(--muted)}.case-top{padding-top:35px;padding-bottom:40px}.back-link{display:block;width:max-content;font-size:12px;text-decoration:none;margin-bottom:38px}.back-link:hover{text-decoration:underline}.case-top h1{margin-top:24px;font-size:clamp(48px,6.4vw,86px);max-width:1000px}.case-intro{font-size:20px;max-width:650px;color:var(--muted)}.case-role{font:11px monospace;margin:27px 0 0}.case-cover{position:relative}.case-cover>img{width:100%;height:clamp(300px,48vw,600px);object-fit:cover;background:#e0e5d6}.case-cover:has(img[src$=".svg"])>img{object-fit:contain}.cover-caption{position:absolute;bottom:14px;left:15px;background:#eeeee7ed;padding:7px 12px;font:9px monospace}.stats{display:grid;grid-template-columns:repeat(3,1fr);padding:28px 0;border-bottom:1px solid var(--line)}.stats>div{border-right:1px solid var(--line);padding-left:25px}.stats>div:first-child{padding-left:0}.stats>div:last-child{border:0}.stats strong{display:block;font-size:35px;letter-spacing:-1px;font-weight:500;line-height:1.4}.stats span{font:10px monospace;color:var(--muted)}.story{max-width:1120px;padding-top:35px}.story-section{display:grid;grid-template-columns:.8fr 1.2fr;gap:9%;padding:48px 0}.story-section h2{font-size:33px;line-height:1.2;letter-spacing:-1px}.story-section p{font-size:16px;color:#57634f}.story-section strong{color:var(--ink)}figure{margin:20px 0 38px;min-width:0}.image-open{padding:0;border:0;background:#e0e5d6;position:relative;width:100%;display:block}.image-open img{max-height:580px;object-fit:contain;width:100%}.zoom{position:absolute;bottom:12px;right:12px;background:var(--paper);width:31px;height:31px;display:grid;place-items:center}.image-open:hover .zoom{background:var(--lime)}figcaption{font:11px/1.7 monospace;color:var(--muted);margin-top:12px;max-width:850px}.image-pair{display:grid;grid-template-columns:1fr 1fr;gap:25px}.image-pair img{height:420px;object-fit:contain}.video-panel{display:grid;grid-template-columns:1fr .75fr;gap:10%;align-items:center;background:var(--ink);color:var(--paper);padding:45px;margin:15px 0 30px}.video-panel h2{font-size:43px;margin-top:20px}.video-panel p{color:#cbd4c2}.video-panel .small{font:10px/1.8 monospace}.video-panel video{width:100%;max-height:540px;background:#151b15}.result-block{padding:35px;background:#dfe8d1;margin:20px 0}.comparison{display:flex;align-items:center;gap:35px;margin:26px 0}.comparison span{display:block;font:11px monospace}.comparison strong{display:block;font-size:50px;font-weight:500;letter-spacing:-2px}.result-arrow{font-size:30px!important}.result-block p{font-size:13px;color:var(--muted);max-width:700px;margin:0}.note-block{border-left:3px solid #8da563;padding:20px 28px;background:#e4e8dc;margin:20px 0}.note-block p{margin:12px 0 0}.next-project{padding:55px 0 75px;border-top:1px solid var(--line);margin-top:35px}.next-project>a:last-child{text-decoration:none;display:block}.next-project h2{margin:12px 0;font-size:40px}dialog{border:0;padding:55px 25px 20px;background:#182019;color:var(--paper);width:min(1200px,95vw);max-height:95vh}dialog::backdrop{background:#0c130de8;backdrop-filter:blur(7px)}dialog img{max-height:75vh;max-width:100%;margin:auto;object-fit:contain}dialog p{font:12px/1.6 monospace;margin:15px auto 0;max-width:850px}.viewer-close{position:absolute;top:10px;right:16px;border:1px solid #6c7a64;border-radius:50%;background:transparent;color:white;font-size:26px;width:36px;height:36px}.viewer-open{overflow:hidden}@view-transition{navigation:auto}::view-transition-old(root){animation:leave .18s ease-in both}::view-transition-new(root){animation:arrive .28s ease-out both}@keyframes leave{to{opacity:0;transform:translateY(-6px)}}@keyframes arrive{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}@media(min-width:1700px){.hero-grid{padding-block:70px}}@media(max-width:900px){.hero-grid{gap:5%}h1{font-size:65px;letter-spacing:-3px}.hero-grid p{font-size:15px}.nav-links{gap:20px}.project-layout{gap:5%}.project-copy h2{font-size:34px}.project-copy>p{font-size:14px}.story-section{gap:6%}.video-panel{gap:6%;padding:30px}.comparison strong{font-size:43px}.case-top h1{letter-spacing:-3px}}@media(max-width:650px){nav{height:72px;gap:15px}.brand{font-size:22px}.nav-links{gap:15px;font-size:10px}.nav-contact{display:none}.hero{padding-top:27px}.hero-top{display:block}.status{margin-top:6px}.hero-grid{grid-template-columns:1fr;padding:33px 0;gap:32px}h1{font-size:64px;letter-spacing:-3px}.hero-photo{aspect-ratio:1.2}.hero-foot{flex-wrap:wrap;gap:9px 20px;font-size:9px}.hero-foot a{display:none}.section-heading{padding:60px 0 35px;display:block}.section-heading h2{font-size:43px}.section-heading>p{margin-top:23px}.project-layout{grid-template-columns:1fr;gap:25px}.reverse .project-picture,.reverse .project-copy{order:initial}.project-band{padding:32px 0 40px}.project-picture>img{aspect-ratio:1.3}.project-copy h2{font-size:37px;margin-top:13px}.project-copy>p{max-width:none}.role{margin-top:17px;padding-top:12px}.text-link{margin-top:20px}.compact .project-picture img{aspect-ratio:1.7}.compact h2{font-size:31px}.about{padding:60px 0}.about-grid{grid-template-columns:1fr;gap:35px}.journey{margin-top:25px}.about h2{font-size:42px}.contact{padding:45px 0}.contact-links{display:grid;gap:20px;font-size:13px}.contact-links a{width:max-content}footer{flex-direction:column;gap:7px;padding:20px 0}.case-top{padding-top:25px;padding-bottom:30px}.case-top h1{font-size:50px;letter-spacing:-2px}.case-intro{font-size:17px}.case-cover>img{height:330px}.stats{gap:13px}.stats>div{padding-left:10px}.stats strong{font-size:25px}.stats span{font-size:9px}.story{padding-top:15px}.story-section{grid-template-columns:1fr;gap:7px;padding:28px 0}.story-section h2{font-size:29px;margin-bottom:13px}.story-section p{font-size:15px}.image-pair{gap:13px}.image-pair img{height:265px}.image-open img{max-height:440px}figcaption{font-size:9px}.video-panel{grid-template-columns:1fr;padding:25px;gap:18px}.video-panel h2{font-size:36px}.video-panel video{width:min(100%,320px);justify-self:center;max-height:450px}.result-block{padding:23px}.comparison{gap:20px;flex-wrap:wrap}.comparison strong{font-size:35px}.comparison span{font-size:9px}.next-project h2{font-size:32px}.next-project{padding:35px 0 45px}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation:none!important;transition:none!important}::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}
/* Evidence-led case-study update */
.outcome{font-size:12px!important;color:var(--ink)!important;border-left:3px solid #8fa85f;padding:9px 13px;background:#dfe7d2;line-height:1.65}.project-crack-detection{background:#183b7c}.project-crack-detection>img{object-fit:contain;aspect-ratio:1.12}.project-bioreactor{background:#fff}.project-bioreactor>img{object-fit:contain;padding:22px}.case-crack-detection{background:#163777}.case-crack-detection>img{object-fit:contain;height:620px;background:transparent}.case-bioreactor>img{object-fit:contain;background:white;padding:25px}.more-work{padding-top:60px;padding-bottom:70px}.more-work>h2{font-size:42px;margin:16px 0}.coursework-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:30px 22px;margin-top:30px}.coursework-card{display:block;text-decoration:none;border-top:1px solid var(--line);padding-top:16px}.coursework-card img{aspect-ratio:1.8;width:100%;object-fit:cover;margin-bottom:16px}.coursework-card .eyebrow{font-size:9px;letter-spacing:1px}.coursework-card h3{font-size:23px;font-weight:500;line-height:1.25;letter-spacing:-.5px;margin:10px 0}.coursework-card h3 span{display:inline-block;transition:transform .2s}.coursework-card:hover h3 span{transform:translate(3px,-3px)}.coursework-card p{font-size:13px;color:var(--muted);margin:12px 0 0}.requirements-table{overflow-x:auto;margin:20px 0 40px}table{border-collapse:collapse;width:100%;font-size:14px;text-align:left}caption{text-align:left;font:11px monospace;text-transform:uppercase;letter-spacing:1px;margin-bottom:16px}th,td{border-bottom:1px solid var(--line);padding:14px 16px}th{background:#e0e7d6;font-weight:500}td:first-child{width:35%}.technical-note{background:#e3e8db;margin:20px 0 45px;padding:20px 25px;font-size:13px}.technical-note summary{cursor:pointer;font-size:14px}.technical-note p{margin:18px 0 0;color:var(--muted)}.coursework-scope{font:11px/1.8 monospace;color:var(--muted);margin:20px 0 45px}.story figure:has(img[src*="ip-"]) .image-open,.story figure:has(img[src*="bio-"]) .image-open{background:#fff}.story figure:has(img[src*="ip-"]) img,.story figure:has(img[src*="bio-"]) img{padding:14px}.story figure:has(img[src*="ip-geometry"]) img{padding:0;max-height:310px}.image-pair:has(img[src*="ip-"]) img{height:auto;min-height:280px;object-fit:contain}.image-pair:has(img[src*="bio-"]) img{height:350px}.image-pair:has(img[src*="bio-wss"]) img{height:320px}@media(max-width:900px){.coursework-grid{grid-template-columns:repeat(2,1fr)}.case-crack-detection>img{height:550px}}@media(max-width:650px){.coursework-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:25px 15px}.coursework-card h3{font-size:20px}.coursework-card p{font-size:12px}.coursework-card .eyebrow{font-size:8px}.more-work{padding-top:40px;padding-bottom:45px}.more-work>h2{font-size:33px}.case-crack-detection>img{height:470px}.case-bioreactor>img{padding:12px}.image-pair:has(img[src*="ip-"]),.image-pair:has(img[src*="bio-"]){grid-template-columns:1fr;gap:0}.image-pair:has(img[src*="ip-"]) img{min-height:0}.image-pair:has(img[src*="bio-"]) img{height:auto;max-height:440px}.outcome{font-size:11px!important}th,td{padding:11px;font-size:12px}}
/* Flight photographs: keep the aircraft and propeller span visible. */
.hero-photo{aspect-ratio:1.35}.hero-photo img{object-position:50% 48%}.project-multirotor-uav>img{aspect-ratio:1.5;object-fit:contain;background:#27302c}.case-multirotor-uav>img{height:auto;max-height:none;aspect-ratio:1.5;object-fit:contain;background:#27302c}@media(max-width:650px){.hero-photo{aspect-ratio:1.35}.case-multirotor-uav>img{height:auto}}
