REV

EAL

let's inspire

a genuine

connection

get in touch

Stylized olive green circular monogram featuring a looping, abstract design within the circle.Thin vertical olive green arrow pointing downwards.

Let’s Talk 

At The Detail, we lead with feeling.

Every activation begins by immersing ourselves in your world and understanding how you want your audience to feel when they leave.

Together, we can transform your brand.

If you prefer a more traditional approach, we welcome conversations by email or phone.

hello@thedetail.agency
+44(0)7884054159

Many thanks, we will be in touch soon.
Oops! Something went wrong while submitting the form.

THANK YOU

We would love the opportunity to connect and bring your next experience to life. To create something meaningful, together.

With Love

document.addEventListener("DOMContentLoaded", () => { if (!window.gsap) return; gsap.registerPlugin(ScrollTrigger); window.addEventListener("load", () => { /* ========================= CONTACT 2 .contact_2: olives -> small opaque bg + fade out on scroll away ========================== */ (function initContact2() { const section = document.querySelector(".contact_2"); if (!section) return; const olives = section.querySelectorAll(".olive"); const smallText = section.querySelector(".contact_page_small_text_opaque"); const tl = gsap.timeline({ scrollTrigger: { trigger: section, start: "top 60%", once: true } }); tl.to(olives, { opacity: 1, duration: 0.9, ease: "power2.out", delay: 0.3 }); if (smallText) { tl.to(smallText, { opacity: 1, duration: 1.1, ease: "sine.inOut" }, "+=0.35"); } ScrollTrigger.create({ trigger: section, start: "bottom 70%", end: "bottom top", scrub: true, onUpdate: self => { const fade = 1 - self.progress; gsap.set(olives, { opacity: fade }); if (smallText) gsap.set(smallText, { opacity: fade }); } }); })(); /* ========================= CONTACT 3 .contact_3: olives -> form -> form opaque bg + fade out on scroll away ========================== */ (function initContact3() { const section = document.querySelector(".contact_3"); if (!section) return; const olives = section.querySelectorAll(".olive"); const form = section.querySelector(".contact_form"); const formBg = section.querySelector(".contact_page_form_opaque"); const tl = gsap.timeline({ scrollTrigger: { trigger: section, start: "top 60%", once: true } }); tl.to(olives, { opacity: 1, duration: 0.9, ease: "power2.out" }); if (form) { tl.to(form, { opacity: 1, duration: 0.7, ease: "power2.out" }, "+=0.3"); } if (formBg) { tl.to(formBg, { opacity: 1, duration: 1.2, ease: "sine.inOut" }, "+=0.2"); } ScrollTrigger.create({ trigger: section, start: "bottom 70%", end: "bottom top", scrub: true, onUpdate: self => { const fade = 1 - self.progress; gsap.set(olives, { opacity: fade }); if (form) gsap.set(form, { opacity: Math.max(0, fade - 0.1) }); if (formBg) gsap.set(formBg, { opacity: Math.max(0, fade - 0.2) }); } }); })(); }); });