Coordinate mind, body & voice.

mind body voice
(function(){ "use strict"; var ABOVE="text06", BELOW="text02", QUOTE="text05"; function boot(){ var slot=document.getElementById("ivh-slot"); if(!slot) return; var C=[document.getElementById("ivh-mind"),document.getElementById("ivh-body"),document.getElementById("ivh-voice")], W=[document.getElementById("ivh-wm"),document.getElementById("ivh-wb"),document.getElementById("ivh-wv")]; var above=document.getElementById(ABOVE), below=document.getElementById(BELOW), quote=document.getElementById(QUOTE); if(above) above.classList.add("ivh-fade"); if(below) below.classList.add("ivh-fade"); var MID=123.50, ALPHA=0.702; /* One choreography, from load. No trigger, nothing to scroll into, nothing that moves. */ var WORD_AT=[200,650,1100,1550], WORD_FADE=1000; var LEAD_OUT_AT=3600, LEAD_OUT=800; var MARK_AT=[4000,4700,5400], MARK_FADE=1100; var CONNECT_AT=6900, CONNECT_FADE=1100; var QUOTE_AT=9400, QUOTE_FADE=1100; var FAILSAFE=12000; var reduced=matchMedia("(prefers-reduced-motion: reduce)").matches; var SHIFT=0, PARTS=null, started=false; function measure(){ if(!above) return; var prev=above.style.transform; above.style.transform="none"; var a=above.getBoundingClientRect(); /* collapse the line's own box so it overlays the mark instead of stacking above it */ var sp=slot.getBoundingClientRect().top-a.top; if(sp>20) above.style.setProperty("margin-bottom",(-sp).toFixed(1)+"px","important"); var s=slot.getBoundingClientRect(); /* clear the transform first: getBoundingClientRect includes it, so measuring while the line is displaced feeds its own shift back in */ var d=(s.top+MID)-(a.top+a.height/2); if(d>10 && d<700) SHIFT=d; above.style.transform=prev; } /* Split the line into its own words so it can write itself. Built with DOM calls, not markup: a "less-than" followed by a letter anywhere in an inline embed's script is parsed as a tag and truncates the whole script. */ function split(){ if(!above || PARTS) return; var txt=(above.textContent||"").replace(/\s+/g," ").trim(); if(txt.toLowerCase()!=="coordinate mind, body & voice.") return; var parts=["Coordinate","mind,","body","& voice."], out=[]; above.textContent=""; parts.forEach(function(w,i){ var s=document.createElement("span"); s.className="ivh-p"; s.textContent=(i?" ":"")+w; s.style.opacity="0"; above.appendChild(s); out.push(s); }); PARTS=out; } function hide(){ for(var i=0;i<3;i++){ C[i].style.opacity="0"; W[i].style.opacity="0"; } if(below){ below.style.opacity="0"; below.style.transform="translateY(8px)"; } if(quote){ quote.style.opacity="0"; } } function finish(){ /* everything visible, no timers involved */ if(PARTS) PARTS.forEach(function(s){ s.style.transition="none"; s.style.opacity="1"; }); if(above){ above.style.transition="none"; above.style.opacity="0"; } for(var i=0;i<3;i++){ C[i].style.transition="none"; W[i].style.transition="none"; C[i].style.opacity=String(ALPHA); W[i].style.opacity="1"; } if(below){ below.style.transition="none"; below.style.opacity="1"; below.style.transform="none"; } if(quote){ quote.style.transition="none"; quote.style.opacity="1"; } } function run(){ if(started) return; started=true; if(above){ above.style.transition="none"; above.style.transform="translateY("+(SHIFT+10).toFixed(1)+"px)"; } setTimeout(function(){ if(above){ above.style.transition="transform 1600ms ease"; above.style.transform="translateY("+SHIFT.toFixed(1)+"px)"; } },50); if(PARTS) PARTS.forEach(function(s,i){ s.style.transition="opacity "+WORD_FADE+"ms ease"; setTimeout(function(){ s.style.opacity="1"; }, WORD_AT[i]); }); if(above) setTimeout(function(){ above.style.transition="opacity "+LEAD_OUT+"ms ease"; above.style.opacity="0"; }, LEAD_OUT_AT); for(var i=0;i<3;i++)(function(i){ C[i].style.transition="opacity "+MARK_FADE+"ms ease"; W[i].style.transition="opacity "+MARK_FADE+"ms ease"; setTimeout(function(){ C[i].style.opacity=String(ALPHA); W[i].style.opacity="1"; }, MARK_AT[i]); })(i); if(below){ below.style.transition="opacity "+CONNECT_FADE+"ms ease, transform "+CONNECT_FADE+"ms ease"; setTimeout(function(){ below.style.opacity="1"; below.style.transform="translateY(0px)"; }, CONNECT_AT); } if(quote){ quote.style.transition="opacity "+QUOTE_FADE+"ms ease"; setTimeout(function(){ quote.style.opacity="1"; }, QUOTE_AT); } } split(); hide(); measure(); /* Reduced motion resolves immediately - it must never wait on load or a timer to become visible. And whatever happens to any timer, everything is visible by FAILSAFE. */ if(reduced){ finish(); } else setTimeout(function(){ if(!started) finish(); }, FAILSAFE); function onLoad(){ if(reduced) return; measure(); if(above) above.style.transform="translateY("+SHIFT.toFixed(1)+"px)"; run(); } window.addEventListener("load",onLoad); if(document.readyState==="complete") onLoad(); window.addEventListener("resize",function(){ measure(); if(above && !started) above.style.transform="translateY("+SHIFT.toFixed(1)+"px)"; }); } if(document.readyState==="loading") document.addEventListener("DOMContentLoaded",boot); else boot(); })();

Connect the way you want to.

“…that combination of specialist knowledge and kindness that gives you confidence the voices he cares for are in good hands…”

Let’s connect

Your details are used only to respond
to your enquiry. See privacy policy.

LoginClient booking area — coming soon.

ResourcesComing soon.

Privacy policy

I respect your privacy and only collect personal information that I need to run this website and respond to enquiries sent through the contact form.What I collect
If you contact me through the website, I may collect whatever you choose to provide — typically your name, email address, and the contents of your message.
How I use it
I use this information to reply to your enquiry, talk with you about the services you have asked about, and keep business records where I need to.
Analytics
This website uses Umami Analytics to understand overall traffic and page usage in a privacy-focused way. Umami sets no tracking cookies and collects anonymised usage data rather than personally identifiable information. The analytics data is hosted in the European Union.
Cookies
This website sets no analytics cookies for Umami. If I add a third-party tool later that relies on cookies or similar technologies, I will update this policy.
Third-party services
I build and host this website with Carrd, so form submissions and related processing may pass through Carrd and its connected email or form delivery services. Those providers may process technical data in order to run the site and deliver messages securely.
Legal basis
My legal basis for processing contact form enquiries is usually my legitimate interest in responding to them and, where it applies, taking steps at your request before entering into a contract.
Retention
I keep enquiry emails and messages only for as long as I reasonably need them to respond, maintain records, and manage an ongoing or potential working relationship.
Your rights
Depending on where you live, you may have the right to ask me for access to, correction of, or deletion of your personal information, and to object to or restrict certain processing.
Contact
If you have a privacy question or want to make a data request, please email me at [email protected]
Back to home