:root{--paper:#f7f7f2;--ink:#18231f;--green:#173f35;--muted:#526058;--line:#c8cec6;--sage:#e8ede2;--white:#fff;--space:clamp(24px,5.3vw,88px)}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:35px}body{margin:0;background:var(--paper);color:var(--ink);font-family:Manrope,'Segoe UI',sans-serif;font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased}::selection{background:#cadcc9;color:var(--green)}a{color:inherit;text-decoration:none}button,input,textarea,select{font:inherit}button{cursor:pointer}button,a,input,select,textarea,summary{outline-offset:5px} :focus-visible{outline:2px solid #29634e}button{color:inherit}img{display:block;max-width:100%;object-fit:cover}h1,h2,h3,p{margin:0}h1,h2,h3{line-height:1.13;letter-spacing:-.035em;text-wrap:balance}h1{font-weight:600;font-size:clamp(48px,5.25vw,76px)}h2{font-size:clamp(30px,3.2vw,46px);font-weight:550}h3{font-size:21px;font-weight:600}p{max-width:68ch}.wrap{width:min(1264px,calc(100% - var(--space)*2));margin-inline:auto}.header{display:flex;align-items:center;justify-content:space-between;min-height:104px;border-bottom:1px solid var(--line);gap:30px}.wordmark{font-size:35px;letter-spacing:-.055em;font-weight:800;color:var(--green);line-height:1}.header nav{display:flex;gap:36px;font-size:14px;font-weight:550}.header nav a:hover,.footer a:hover{color:#39694f}.button{display:inline-flex;justify-content:center;align-items:center;min-height:52px;padding:13px 26px;background:var(--green);border:1px solid var(--green);color:var(--white);font-size:15px;font-weight:650;letter-spacing:0;transition:background .18s ease}.button:hover{background:#285d49}.button:active{background:#102e26}.button.compact{min-height:44px;padding:10px 21px}.menu-button{display:none}.skip{position:fixed;top:-100px;left:16px;padding:12px;background:white;z-index:20}.skip:focus{top:12px}.mobile-menu[hidden]{display:none}.hero{display:grid;grid-template-columns:1fr 1fr;gap:clamp(36px,6vw,92px);padding-block:76px 64px;align-items:start}.hero-copy{padding-top:20px}.service-label{font-size:13px;font-weight:600;margin-bottom:35px;color:var(--green)}.lead{font-size:clamp(18px,1.5vw,21px);line-height:1.65}.hero .lead{margin-top:28px;max-width:440px}.actions{display:flex;align-items:center;gap:28px;flex-wrap:wrap;margin-top:32px}.text-link{background:none;border:none;padding:8px 0;text-decoration:underline;text-underline-offset:6px;font-weight:600;font-size:15px;min-height:44px}.text-link span{margin-left:14px}.scene-photo{position:relative;background:var(--sage);overflow:hidden;aspect-ratio:1.22}.scene-photo img{width:100%;height:100%;transition:opacity .22s ease}.image-note{position:absolute;right:10px;bottom:10px;background:var(--paper);font-size:10px;padding:3px 7px;color:var(--muted)}.scene-tabs{display:grid;grid-template-columns:repeat(3,1fr);border-bottom:1px solid var(--line);gap:12px}.scene-tabs button{background:none;border:0;border-bottom:3px solid transparent;padding:17px 0 13px;font-size:11px;text-align:left;line-height:1.5}.scene-tabs [aria-selected=true]{border-bottom-color:var(--green);font-weight:750}.scene-tabs button:hover{color:#2c6448}#scene-description{font-size:12px;color:var(--muted);margin-top:12px;min-height:40px}.needs{padding:10px 0 65px;border-bottom:1px solid var(--line)}.needs h2{font-size:30px;margin-bottom:32px}.needs-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:42px}.need{background:none;border:0;text-align:left;padding:6px 0;display:flex;flex-direction:column;align-items:start;gap:10px}.need-title{font-size:23px;font-weight:600;letter-spacing:-.03em}.need>span:nth-child(2){font-size:14px;color:var(--muted)}.need-action{font-size:12px;font-weight:600;margin-top:9px;border-bottom:1px solid transparent}.need-action b{margin-left:12px}.need:hover .need-action{border-color:var(--green)}.services{padding-block:85px}.section-head{display:grid;grid-template-columns:1.05fr 1fr;gap:70px;margin-bottom:50px}.section-head>p{font-size:17px;max-width:460px;color:var(--muted)}.service-groups{display:grid;grid-template-columns:1fr 1fr 1fr;gap:38px}.service-group>h3{font-size:13px;letter-spacing:0;font-weight:650;color:var(--green);padding-bottom:18px;border-bottom:2px solid var(--green)}.service-item{border-bottom:1px solid var(--line)}summary{cursor:pointer;list-style:none}summary::-webkit-details-marker{display:none}.service-item summary{padding:25px 30px 25px 0;position:relative}.service-item h4{font-size:18px;line-height:1.35;font-weight:650;letter-spacing:-.02em;margin:0 0 8px}.service-desc{font-size:13px;line-height:1.65;color:var(--muted);min-height:43px}.price{font-size:12px;margin-top:10px;color:var(--muted);font-variant-numeric:tabular-nums}.toggle{position:absolute;right:0;top:28px;width:20px;height:20px;font-size:21px;font-weight:400;line-height:1}.service-item[open] .toggle{transform:rotate(45deg)}.service-item summary:hover h4{color:#367057}.service-body{padding:0 0 24px;font-size:13px}.service-body dl{margin:0}.service-body dt{font-weight:700;margin:16px 0 5px}.service-body dd{margin:0;color:var(--muted)}.service-body button{margin-top:16px}.price-note{font-size:12px;color:var(--muted);margin-top:25px}.delivery{background:var(--sage);padding:50px;display:grid;grid-template-columns:1fr 1fr;gap:65px}.delivery .lead{font-size:19px;margin:25px 0 16px}.delivery-copy>p:not(.lead){font-size:14px;color:var(--muted)}.commitments{list-style:none;margin:25px 0 0;padding:0;font-size:13px}.commitments li{padding:8px 0;border-bottom:1px solid #c8d3c1}.sample{background:#fff;padding:30px;align-self:center}.sample-top{display:flex;justify-content:space-between;gap:14px;font-size:10px;color:var(--muted);margin-bottom:24px}.sample h3{font-size:26px}.sample dl{margin:24px 0}.sample dl>div{display:grid;grid-template-columns:90px 1fr;gap:14px;border-top:1px solid var(--line);padding:13px 0;font-size:12px}.sample dt{font-weight:650}.sample dd{margin:0}.sample>p{font-size:11px;color:var(--muted)}.process{padding-block:78px}.process ol{list-style:none;display:grid;grid-template-columns:repeat(4,1fr);gap:36px;padding:0;margin:38px 0 0}.process li>span{color:var(--green);font-size:14px;font-weight:700}.process h3{font-size:19px;margin:9px 0 14px}.process p{font-size:13px;color:var(--muted)}.about{display:grid;grid-template-columns:1fr 1fr;gap:70px;border-top:1px solid var(--line);padding-block:55px}.about h2{font-size:30px}.about p{font-size:15px;color:var(--muted)}.enquiry{border-top:1px solid var(--line);padding-block:70px 80px;display:grid;grid-template-columns:.85fr 1.3fr;gap:85px}.enquiry h2{font-size:39px}.enquiry h2+p{margin-top:20px}.next-step{font-size:13px;color:var(--muted);margin-top:24px;max-width:280px}.preview-notice{font-size:12px;color:var(--green);border-bottom:1px solid var(--line);padding-bottom:12px;margin-bottom:22px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}label{display:block;font-size:12px;font-weight:650;margin-bottom:20px}input,textarea,select{display:block;width:100%;margin-top:7px;min-height:46px;padding:10px 12px;border:1px solid #8f9e93;border-radius:2px;background:transparent;color:var(--ink);font-size:14px;font-weight:400;caret-color:var(--green)}textarea{resize:vertical;min-height:118px}textarea::placeholder,input::placeholder{color:#637166;opacity:1}select{padding-right:20px}.choices label{font-weight:500}.optional{margin-bottom:24px}.optional summary{font-size:12px;color:var(--green);padding:10px 0;text-decoration:underline;text-underline-offset:4px}.optional .form-grid{margin-top:16px}.form-note{font-size:11px;color:var(--muted);margin-top:15px}.brief-review{background:var(--sage);padding:26px}.brief-review[hidden]{display:none}.brief-review>p{font-size:13px;margin-top:16px}.brief-review dl{font-size:13px}.brief-review dt{font-weight:700;margin-top:12px}.brief-review dd{margin:3px 0;white-space:pre-wrap;overflow-wrap:anywhere}.footer{border-top:1px solid var(--line);padding:30px 0;display:flex;align-items:center;justify-content:space-between;gap:24px;font-size:11px}.footer .wordmark{font-size:28px}.footer p{color:var(--muted)}[hidden]{display:none!important}
@media(min-width:1600px){.hero{padding-top:90px}.service-desc{min-height:43px}}
@media(max-width:1050px){.header nav{gap:20px}.hero{gap:35px}.service-groups{gap:22px}.service-item h4{font-size:16px}.delivery{gap:30px;padding:35px}.enquiry{gap:45px}.sample{padding:23px}.sample dl>div{grid-template-columns:75px 1fr}.process ol{gap:24px}.scene-tabs button{font-size:10px}.service-label{font-size:11px}.hero .lead{font-size:17px}}
@media(max-width:760px){:root{--space:24px}.header{min-height:82px}.wordmark{font-size:30px}.header nav,.header>.button{display:none}.menu-button{display:block;background:none;border:1px solid var(--line);padding:9px 15px;min-height:44px;font-size:13px}.mobile-menu{padding-block:15px;border-bottom:1px solid var(--line);display:grid;gap:6px}.mobile-menu a{padding:9px 0}.hero{grid-template-columns:1fr;padding-block:35px 30px;gap:38px}.hero-copy{padding:0}.hero h1{font-size:clamp(44px,9vw,60px)}.service-label{font-size:11px;margin-bottom:22px}.hero .lead{max-width:420px;font-size:17px;margin-top:22px}.actions{margin-top:25px;gap:23px}.scene-photo{aspect-ratio:1.4}.scene-tabs button{font-size:11px;min-height:60px}.needs{padding:16px 0 35px}.needs h2{font-size:26px;margin-bottom:15px}.needs-grid{grid-template-columns:1fr;gap:0}.need{padding:20px 0;border-bottom:1px solid var(--line);gap:6px}.need:last-child{border:0}.need-title{font-size:22px}.need-action{margin-top:7px}.section-head{grid-template-columns:1fr;gap:18px;margin-bottom:30px}.section-head p{font-size:15px}.services{padding-block:44px}.service-groups{grid-template-columns:1fr;gap:35px}.service-group>h3{font-size:14px;padding-bottom:13px}.service-item h4{font-size:20px}.service-desc{min-height:0;font-size:14px}.price{font-size:13px}.service-item summary{padding-block:23px}.service-body{font-size:14px}.delivery{padding:30px 24px;grid-template-columns:1fr;gap:35px}.delivery h2{font-size:34px}.delivery .lead{font-size:18px}.sample{padding:22px}.sample-top{font-size:9px}.sample dl>div{font-size:12px;grid-template-columns:75px 1fr}.process{padding-block:45px}.process ol{grid-template-columns:1fr 1fr;gap:30px 23px;margin-top:30px}.process h3{font-size:18px}.about{grid-template-columns:1fr;gap:22px;padding-block:35px}.about h2{font-size:28px}.enquiry{grid-template-columns:1fr;gap:30px;padding-block:44px}.enquiry h2{font-size:36px}.next-step{max-width:none;margin-top:12px}.form-grid{grid-template-columns:1fr;gap:0}.optional .form-grid{grid-template-columns:1fr}.footer{flex-wrap:wrap;gap:15px}.footer p{width:100%;order:3}.footer span{margin-left:auto}.button{min-height:48px}.form-note{font-size:12px}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{transition:none!important;animation:none!important}}

.wa-link{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;white-space:nowrap;background:var(--green);color:#fff;padding:10px 15px;font-size:13px;font-weight:650;min-height:44px;border:1px solid var(--green);transition:background .18s ease}.wa-link:hover{background:#285d49}.wa-enquiry{margin-top:28px}.wa-enquiry>p{font-size:11px;color:var(--muted);margin-top:10px;max-width:280px}.wa-floating{position:fixed;right:24px;bottom:24px;z-index:10;padding:10px 15px;font-size:12px;min-height:44px;white-space:nowrap;box-shadow:0 5px 20px #18231f24}.footer{padding-bottom:110px}@media(max-width:760px){.wa-floating{right:12px;bottom:max(12px,env(safe-area-inset-bottom));padding:10px 14px;font-size:12px;min-height:44px}.footer{padding-bottom:112px}.enquiry{padding-bottom:95px}}

/* UI refinement: quiet hierarchy, legible details and deliberate interaction. */
:root{--section-space:clamp(48px,6vw,88px)}
.header nav a{padding-block:12px}
.hero{padding-bottom:56px}
.hero .lead{max-width:36ch}
.service-label{letter-spacing:.025em}
.scene-tabs button{font-size:12px;min-height:62px}
#scene-description{font-size:14px;line-height:1.6}
.needs-grid{gap:0}
.need{padding:16px 28px;transition:background .18s ease}
.need:first-child{padding-left:0}
.need+.need{border-left:1px solid var(--line)}
.need:hover{background:var(--sage)}
.need-action{font-size:14px}
.need-action b{display:inline-block;transition:transform .18s ease}
.need:hover .need-action b{transform:translateX(4px)}
.services,.process{padding-block:var(--section-space)}
.section-head{margin-bottom:28px}
.service-filters{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:36px}
.service-filters button{border:1px solid var(--line);background:transparent;border-radius:3px;padding:10px 16px;font-size:14px;min-height:44px;transition:background .18s ease,color .18s ease}
.service-filters button:hover{background:var(--sage)}
.service-filters [aria-pressed=true]{background:var(--green);border-color:var(--green);color:white}
.service-filters span{margin-left:8px;opacity:.8}
.service-groups{align-items:start}
.service-groups.is-filtered{display:block}
.is-filtered .service-group{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0 38px;align-items:start}
.is-filtered .service-group>h3{grid-column:1/-1}
.service-item[open]{background:#eef1e9}
.service-item[open] summary,.service-item[open] .service-body{padding-left:14px;padding-right:30px}
.service-item[open] .toggle{right:10px}
.service-body{font-size:14px;line-height:1.7}
.price{font-size:14px;font-weight:650;color:var(--green);margin-top:14px}
.price-note{font-size:13px;max-width:none}
.process li{border-top:1px solid var(--line);padding-top:20px}
.process p,.commitments,.next-step{font-size:14px}
.sample-top,.sample>p{font-size:12px}
.sample dl>div{font-size:14px;grid-template-columns:96px 1fr}
.enquiry{gap:clamp(32px,6vw,85px)}
.enquiry>div{min-width:0}
.enquiry>div:nth-child(2){background:#fff;border:1px solid var(--line);padding:clamp(20px,3vw,36px)}
.preview-notice{font-size:13px;line-height:1.6}
.form-eyebrow{font-size:11px;letter-spacing:.12em;font-weight:700;color:var(--muted);margin-bottom:20px}
label{font-size:14px}
input,textarea,select{font-size:16px;background:#fff;min-height:50px;border-radius:3px;transition:border-color .15s ease,box-shadow .15s ease}
input:focus,textarea:focus,select:focus{border-color:var(--green);box-shadow:0 0 0 3px #173f3512}
.optional summary{font-size:14px;min-height:44px}
.form-note{font-size:12px;line-height:1.7}
.brief-review{padding:0;background:none}
.brief-review dl{font-size:14px;border-block:1px solid var(--line);padding-block:12px}
.brief-review .actions{gap:16px}
#email-brief{gap:12px}
.footer-email{overflow-wrap:anywhere;text-decoration:underline;text-underline-offset:4px}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
@media(max-width:1050px){.scene-tabs button{font-size:12px}.need{padding-inline:18px}.is-filtered .service-group{gap:0 22px}}
@media(max-width:760px){
 .need,.need:first-child{padding:22px 0}.need+.need{border-left:0}
 .is-filtered .service-group{display:block}
 .service-filters{gap:8px;margin-bottom:28px}.service-filters button{padding:10px 12px;font-size:13px}
 .scene-tabs{gap:10px}.scene-tabs button{font-size:12px}
 .enquiry>div:nth-child(2){padding:22px 18px}
 .enquiry .button{width:100%}
 .sample dl>div{font-size:13px;grid-template-columns:80px 1fr}


}
@media(max-width:380px){:root{--space:18px}.process ol{grid-template-columns:1fr}.sample{padding:18px}.scene-tabs button{font-size:11px}}

/* Finite motion feedback; touch and reduced-motion states stay quiet. */
:root{--motion-fast:160ms;--motion-ease:cubic-bezier(.22,1,.36,1)}
.button,.wa-link{transition:background var(--motion-fast) ease,transform var(--motion-fast) var(--motion-ease)}
.toggle{transition:transform var(--motion-fast) var(--motion-ease)}
.text-link span{display:inline-block;transition:transform var(--motion-fast) var(--motion-ease)}
.process li>span{display:inline-flex;align-items:center;justify-content:center;min-width:36px;min-height:36px;border:1px solid var(--line);transition:background 240ms ease,color 240ms ease}
.process .step-revealed>span{background:var(--green);color:white;border-color:var(--green)}
@media(hover:hover) and (pointer:fine){.button:hover,.wa-link:hover{transform:translateY(-2px)}.text-link:hover span{transform:translateX(3px)}}
.button:active,.wa-link:active{transform:translateY(0)}
@media(prefers-reduced-motion:reduce){.button,.wa-link,.text-link span,.need-action b{transform:none!important}.process li>span{transition:none}}

/* Audit remediation: field boundaries and safe disabled-form fallback. */
input,textarea,select{border-color:#707f74}
#enquiry-fields{margin:0;padding:0;border:0;min-width:0}
#enquiry-fields:disabled{opacity:.65}
#form-availability{font-size:14px;margin-top:16px}
.service-body a{display:inline-flex;margin-top:16px;align-items:center}

.brand-lockup{flex-shrink:0}.brand-region{margin-top:8px;font-size:12px;font-weight:400;letter-spacing:.04em;color:var(--muted)}
.scene-playback{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:8px;font-size:12px;color:var(--muted)}
#scene-play{min-height:44px;padding:8px 14px;border:1px solid var(--line);background:transparent;color:var(--green);font-size:12px}#scene-play:hover{background:var(--sage)}
@media(min-width:761px) and (max-width:1100px){.header{flex-wrap:wrap;padding-block:20px;gap:18px}.header>.button{font-size:13px;padding-inline:16px}.header nav{gap:16px}}
@media(max-width:640px){.wa-floating{display:none}body.wa-floating-safe-to-show .wa-floating{display:inline-flex}}

/* Legal pages and footer links */
.legal-content{max-width:840px;padding-block:58px 78px}
.legal-content h1{font-size:clamp(40px,4.2vw,56px);margin-bottom:24px}
.legal-content .legal-intro{font-size:17px;line-height:1.7;color:var(--ink);margin-bottom:34px}
.legal-content section{margin-top:28px}
.legal-content h2{font-size:24px;margin-bottom:12px}
.legal-content p{max-width:74ch;color:var(--muted);margin-top:12px}
.legal-content section p:first-of-type{margin-top:0}
.legal-content a{color:var(--green);text-decoration:underline;text-underline-offset:3px}
.footer-tagline{max-width:none}
.footer-details{display:flex;align-items:center;gap:12px 18px;flex-wrap:wrap;min-width:0}
.footer-details>p{max-width:none}
.footer-details a{text-decoration:underline;text-underline-offset:4px}
.footer-legal{display:flex;align-items:center;gap:16px}.linkedin-inline{display:flex;width:max-content;margin-top:4px;font-size:12px}
.footer-whatsapp{text-decoration:underline;text-underline-offset:4px}
@media(max-width:760px){
 .legal-content{padding-block:40px 56px}
 .legal-content h2{font-size:21px}
 .legal-content .legal-intro{font-size:16px;margin-bottom:28px}
 .footer{align-items:flex-start}
 .footer-tagline{order:1;width:100%}
 .footer-details{order:2;width:100%;align-items:flex-start;gap:10px 16px}
 .footer-details>p{flex-basis:100%;width:auto;order:0}
 .footer-whatsapp{order:3;flex-basis:100%}
}
body.wa-floating-blocked .wa-floating{display:none!important}


/* ==========================================================================================
   v3 — interface polish and motion graphics. Content, structure and behaviour are unchanged.
   Hidden/animated starting states exist only under html.js and prefers-reduced-motion:no-preference,
   so the finished page is what no-JS and reduced-motion visitors get.
   ========================================================================================== */
:root{--ease-out:cubic-bezier(.22,1,.36,1);--ease-expo:cubic-bezier(.16,1,.3,1);--ease-in-out:cubic-bezier(.76,0,.24,1);--ease-exit:cubic-bezier(.55,.055,.675,.19)}
html{scroll-padding-top:24px}
@media(max-width:760px){html{scroll-padding-top:40px}}

/* Header: stays in reach, steps aside while reading down, returns on the way up. */
.site-top{position:sticky;top:0;z-index:30;background:var(--paper);transition:transform .34s var(--ease-out),box-shadow .24s ease}
.site-top.is-stuck{box-shadow:0 10px 24px -18px rgba(24,35,31,.45)}
.site-top.is-hidden{transform:translateY(-100%)}
.site-top .mobile-menu{background:var(--paper)}
.header nav a{position:relative}
.header nav a::after{content:"";position:absolute;left:0;right:0;bottom:6px;height:2px;background:var(--green);transform:scaleX(0);transform-origin:left;transition:transform .34s var(--ease-out)}
.header nav a:hover::after,.header nav a[aria-current=true]::after{transform:scaleX(1)}
.header nav a[aria-current=true]{color:var(--green)}
.mobile-menu a[aria-current=true]{color:var(--green);font-weight:650}

/* Lines are blocks so the authored two-line headings hold their shape everywhere. */
.line{display:block}

/* Feedback under the hand. */
.button:active,.wa-link:active{transform:translateY(0) scale(.97)}
.service-filters button[aria-pressed=true],.service-filters button[aria-pressed=true]:hover{background:var(--green);border-color:var(--green);color:#fff}
.service-item.is-closing .toggle{transform:none}
.service-item summary{transition:background .2s ease}
.footer a{display:inline-block;padding-block:11px}
.footer-legal{gap:8px 18px}
.footer a.wordmark{padding-block:0}

/* Hover-only affordances stay off touch. */
@media(hover:hover) and (pointer:fine){
 .service-item:not([open]) summary:hover{background:linear-gradient(90deg,rgba(232,237,226,.7),rgba(232,237,226,0))}
}

/* Floating WhatsApp: keep a measurable box when it steps aside, so the overlap guard can settle. */
body.wa-floating-blocked .wa-floating{display:inline-flex!important;visibility:hidden;opacity:0;pointer-events:none}
.wa-floating{transition:opacity .2s ease,background var(--motion-fast) ease,transform var(--motion-fast) var(--motion-ease)}

/* Legal and 404 pages: the way home stays visible on phones. */
@media(max-width:760px){.header>.button.header-home{display:inline-flex}}

/* Small text floor. */
.image-note{font-size:12px}
.form-eyebrow,.wa-enquiry>p,.footer{font-size:12px}
.scene-tabs button,.service-label{font-size:12px}
@media(max-width:380px){.scene-tabs button{font-size:12px}}

/* ---- Motion graphics (no-preference only) ------------------------------------------------ */
@media(prefers-reduced-motion:no-preference){

 /* Hero: the focal sequence. Settles in about 1.3s; nothing waits for scroll. */
 .js .hero h1 .line{overflow:clip;padding-bottom:.12em;margin-bottom:-.12em}
 .js .hero h1 .line>span{display:block;transform:translateY(108%);animation:tp-line .95s var(--ease-expo) forwards;animation-delay:.1s}
 .js .hero h1 .line:nth-child(2)>span{animation-delay:.21s}
 .js .hero .service-label,.js .hero .lead,.js .hero .actions{opacity:0;transform:translateY(14px);animation:tp-rise .7s var(--ease-out) forwards}
 .js .hero .service-label{animation-delay:.04s}
 .js .hero .lead{animation-delay:.42s}
 .js .hero .actions{animation-delay:.54s}
 .js .hero .scene-photo{clip-path:inset(0 0 100% 0);animation:tp-open 1.05s var(--ease-in-out) .12s forwards}
 .js .hero .scene-photo img{scale:1.16;animation:tp-settle 1.35s var(--ease-expo) .1s forwards}
 .js .hero .scene-tabs,.js .hero .scene-playback,.js .hero #scene-description{opacity:0;animation:tp-fade .8s ease .9s forwards}
 .js.deep-link .hero h1 .line>span,.js.deep-link .hero .service-label,.js.deep-link .hero .lead,.js.deep-link .hero .actions,.js.deep-link .hero .scene-photo,.js.deep-link .hero .scene-photo img,.js.deep-link .hero .scene-tabs,.js.deep-link .hero .scene-playback,.js.deep-link .hero #scene-description{animation-duration:.01s;animation-delay:0s}
 @keyframes tp-line{to{transform:none}}
 @keyframes tp-rise{to{opacity:1;transform:none}}
 @keyframes tp-open{to{clip-path:inset(0)}}
 @keyframes tp-settle{to{scale:1.08}}
 @keyframes tp-fade{to{opacity:1}}

 /* Scene tabs: the active tab shows the countdown to the next scene while scenes play. */
 .scene-tabs button{position:relative}
 .scene-tabs button::after{content:"";position:absolute;left:0;right:0;bottom:-3px;height:3px;background:var(--green);transform:scaleX(0);transform-origin:left}
 .scene.is-playing .scene-tabs [aria-selected=true]{border-bottom-color:#7a9484}
 .scene.is-playing .scene-tabs [aria-selected=true]::after{animation:tp-progress 6.5s linear forwards}
 @keyframes tp-progress{to{transform:scaleX(1)}}

 /* Hero picture drifts a little as the hero leaves (scroll-linked, linear). */
 @supports(animation-timeline:view()){
  .hero{view-timeline-name:--hero}
  .js .hero .scene-photo img{animation:tp-settle 1.35s var(--ease-expo) .1s forwards,tp-par linear both;animation-timeline:auto,--hero;animation-range:normal,exit 0% exit 100%}
  @keyframes tp-par{from{translate:0 0}to{translate:0 4%}}
 }

 /* Floating chat link arrives once the hero has settled. */
 .wa-floating{animation:tp-wa .6s var(--ease-out) 1.5s backwards}
 @keyframes tp-wa{from{opacity:0;transform:translateY(16px)}}

 /* Scroll reveals — manner follows the content: rise, masked lines, settle. Once, never replayed. */
 .js [data-rv]{transition:opacity .75s var(--ease-out) calc(var(--i,0)*70ms),transform .9s var(--ease-out) calc(var(--i,0)*70ms)}
 .js [data-rv=rise]:not(.is-in){opacity:0;transform:translateY(24px)}
 .js [data-rv=lines] .line{overflow:clip;padding-bottom:.12em;margin-bottom:-.12em}
 .js [data-rv=lines] .line>span{display:block;transition:transform .95s var(--ease-expo) calc(var(--li,0)*110ms)}
 .js [data-rv=lines]:not(.is-in) .line>span{transform:translateY(110%)}
 .js .case-card[data-rv] img{transition:scale 1.2s var(--ease-expo) calc(var(--i,0)*70ms)}
 .js .case-card[data-rv]:not(.is-in) img{scale:1.1}

 /* Opening band: "One task. One team. One agreed result." arrives as three beats. */
 .js .mock-strip[data-gfx]{transition:clip-path .95s var(--ease-in-out)}
 .js .mock-strip[data-gfx]:not(.gfx-in){clip-path:inset(0 100% 0 0)}
 .mock-strip .beat{display:inline-block}
 .js .mock-strip[data-gfx] .beat,.js .mock-strip[data-gfx] .mock-strip-sub{transition:opacity .55s var(--ease-out) calc(.3s + var(--b,3)*.14s),transform .65s var(--ease-out) calc(.3s + var(--b,3)*.14s)}
 .js .mock-strip[data-gfx]:not(.gfx-in) .beat,.js .mock-strip[data-gfx]:not(.gfx-in) .mock-strip-sub{opacity:0;transform:translateY(12px)}

 /* "How we deliver": the chain draws itself, node by node, and ends on a check. */
 .js .mock-chain-steps[data-gfx] .mock-chain-step::before{transition:transform .6s var(--ease-in-out) calc(var(--n)*.4s)}
 .js .mock-chain-steps[data-gfx] .mock-chain-step::after{transition:transform .38s var(--ease-out) calc(var(--n)*.4s + .1s)}
 .js .mock-chain-steps[data-gfx]:not(.gfx-in) .mock-chain-step::before{transform:scaleX(0)}
 .js .mock-chain-steps[data-gfx]:not(.gfx-in) .mock-chain-step::after{transform:scale(0)}
 .js .mock-chain-steps[data-gfx] .mock-chain-step>div{transition:opacity .55s var(--ease-out) calc(var(--n)*.11s + .08s),transform .65s var(--ease-out) calc(var(--n)*.11s + .08s)}
 .js .mock-chain-steps[data-gfx]:not(.gfx-in) .mock-chain-step>div{opacity:0;transform:translateY(10px)}
 .js .mock-chain-steps[data-gfx] .chain-check path{transition:stroke-dashoffset .5s var(--ease-out) 2.15s}
 .js .mock-chain-steps[data-gfx]:not(.gfx-in) .chain-check path{stroke-dashoffset:24}

 /* Commissioned Training: the three steps connect left to right. */
 .js .steps3[data-gfx] .step4::before{transition:transform .65s var(--ease-in-out) calc(var(--n)*.3s)}
 .js .steps3[data-gfx]:not(.gfx-in) .step4::before{transform:scaleX(0)}
 .js .steps3[data-gfx] .step4>div{transition:opacity .55s var(--ease-out) calc(var(--n)*.1s + .08s),transform .65s var(--ease-out) calc(var(--n)*.1s + .08s)}
 .js .steps3[data-gfx]:not(.gfx-in) .step4>div{opacity:0;transform:translateY(10px)}

 /* Process: a line runs across each step as its number fills. */
 .process li{position:relative}
 .process li::before{content:"";position:absolute;left:0;right:0;top:-1px;height:2px;background:var(--green);transform:scaleX(0);transform-origin:left;transition:transform .7s var(--ease-in-out)}
 .process li.step-revealed::before{transform:scaleX(1)}

 /* Sample plan: a quiet pass down the rows shows the order the plan runs in. */
 .sample dl>div{position:relative}
 .js .sample[data-gfx].gfx-in dl>div{animation:tp-row 1.2s ease both;animation-delay:calc(.4s + var(--r)*.22s)}
 @keyframes tp-row{0%{background-color:rgba(23,63,53,.1)}100%{background-color:rgba(23,63,53,0)}}

 /* Service filter chip: the pressed state slides in. */
 .service-filters button{transition:background .2s ease,color .2s ease,border-color .2s ease}
}

/* Chain nodes, lines and the check use their finished state by default (no JS, reduced motion). */
.mock-chain-step{position:relative}
.mock-chain-step::before{content:"";position:absolute;left:0;right:-16px;top:-2px;height:2px;background:#9fc3b1;transform-origin:left}
.mock-chain-step:last-child::before{right:0}
.mock-chain-step::after{content:"";position:absolute;left:0;top:-7px;width:12px;height:12px;border-radius:50%;background:#f6f5f0}
.mock-chain-step:last-child::after{width:22px;height:22px;top:-12px;background:#9fc3b1}
.chain-check{position:absolute;left:0;top:-12px;width:22px;height:22px;fill:none;stroke:#1e3f32;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;z-index:1}
.chain-check path{stroke-dasharray:24;stroke-dashoffset:0}
.mock-chain-step:nth-child(1){--n:0}.mock-chain-step:nth-child(2){--n:1}.mock-chain-step:nth-child(3){--n:2}.mock-chain-step:nth-child(4){--n:3}.mock-chain-step:nth-child(5){--n:4}
@media(max-width:639px){.mock-chain-step::before{right:0}.mock-chain-step{padding-top:14px}.mock-chain-step::after{top:-7px}}
.steps3 .step4{position:relative;border-top:2px solid #c8cec6}
.steps3 .step4::before{content:"";position:absolute;left:0;right:-14px;top:-2px;height:2px;background:#1e3f32;transform-origin:left}
.steps3 .step4:last-child::before{right:0}
.steps3 .step4:nth-child(1){--n:0}.steps3 .step4:nth-child(2){--n:1}.steps3 .step4:nth-child(3){--n:2}
@media(max-width:639px){.steps3 .step4::before{right:0}}
.sample dl>div:nth-child(1){--r:0}.sample dl>div:nth-child(2){--r:1}.sample dl>div:nth-child(3){--r:2}.sample dl>div:nth-child(4){--r:3}.sample dl>div:nth-child(5){--r:4}

/* Review fixes: skip link above the sticky header; anchors clear the header when it is showing. */
.skip{z-index:40}
#services,#delivery,#results,#about,#enquiry,#commissioned-training{scroll-margin-top:80px}
@media(max-width:760px){#services,#delivery,#results,#about,#enquiry,#commissioned-training{scroll-margin-top:56px}}