const { Reveal: RevealC, RevealText: RevealTextC, Marquee: MarqueeC, LiveClock: LiveClockC, SERVICES: SERVICES_C, PROCESS: PROCESS_C, JOURNAL: JOURNAL_C } = window; function ContactForm() { const [state, setState] = React.useState('idle'); const [err, setErr] = React.useState(''); async function submit(e) { e.preventDefault(); const fd = new FormData(e.target); setState('sending'); setErr(''); try { const r = await fetch('/contact.php', { method: 'POST', body: fd }); const j = await r.json(); if (j.ok) { setState('done'); } else { setState('idle'); setErr(j.error || 'Something broke — please try again.'); } } catch (_) { setState('idle'); setErr('Something broke — please try again.'); } } if (state === 'done') { return

Got it. We read everything, and we reply within two working days.

; } return (
{err &&

{err}

}
); } function DirectionC() { return (
{/* HERO */}

WE MAKE stubborn brands FOR FOUNDERS WHO WON'T BUDGE.

Keep scrolling
{/* SERVICES */}
[ 01 ] The work

Five crafts, one opinion.

{SERVICES_C.map((s, i) => (
[ {s.num} ]
{s.name}
{s.desc}
{s.tags.map(t => {t})}
))}
{/* PROCESS */}
[ 02 ] How it runs

Four steps.
Zero padding.

{PROCESS_C.map((p, i) => (
Step {p.num}

{p.name}

{p.desc}

))}
{/* JOURNAL */}
[ 03 ] Journal

Notes from the floor.

{JOURNAL_C.map((j, i) => (
{j.cat} {j.date}

{j.title}

Read · {j.read}
))}
{/* CTA */}
[ 04 ] Contact

BRING US the brief NOBODY ELSE WANTED.

The roster stays short on purpose — a few clients at a time, never more. Tell us what you're trying to change and we'll tell you, honestly, whether we're the right hands for it.

Nayberry Agency
Studio Jobs
Contact Get in touch
© 2026 Nayberry Agency LLC v1.0
); } window.DirectionC = DirectionC;