// contact.jsx — form, Calendly card, social links const { useState: useStateC, useEffect: useEffectC } = React; const CONTACT_DEFAULTS = { email: "obada@visimatic.com", calendlyUrl: "https://calendly.com/visimaticnew/30min", socials: [ { name: "Instagram", handle: "@visimatic_", icon: "ig", url: "https://www.instagram.com/visimatic_/" }, { name: "Dribbble", handle: "/visimatic", icon: "dr", url: "https://dribbble.com/visimatic" }, ], }; function getContactInfo() { const remote = window.__VM_REMOTE_CONTENT__?.contact; if (!remote) return CONTACT_DEFAULTS; return { email: remote.email || CONTACT_DEFAULTS.email, calendlyUrl: remote.calendlyUrl || CONTACT_DEFAULTS.calendlyUrl, socials: (remote.socials && remote.socials.length) ? remote.socials : CONTACT_DEFAULTS.socials, }; } function Contact({ setRoute }) { const [form, setForm] = useStateC({ name: "", email: "", subject: "Project enquiry", message: "" }); const [status, setStatus] = useStateC("idle"); // idle | sending | sent const mobile = useMobile(); const contactInfo = getContactInfo(); const submit = async (e) => { e.preventDefault(); if (!form.email.includes("@") || form.message.length < 10) return; setStatus("sending"); try { const res = await fetch("https://formspree.io/f/xrejpezr", { method: "POST", headers: { "Content-Type": "application/json", "Accept": "application/json" }, body: JSON.stringify(form), }); setStatus(res.ok ? "sent" : "idle"); } catch { setStatus("idle"); } }; return (
— Get in touch

Say{" "} hello.
Or just lurk.

The fastest way to start a project is the order form. But if you've got a custom brief, want to chat first, or just want to say hi — drop me a note.

{/* ─── left rail ─── */}
{/* ─── right: form ─── */}
— Message form
Drop me a line.
setForm(f => ({ ...f, name: e.target.value }))} placeholder="Alex Doe" style={inputStyleC} /> setForm(f => ({ ...f, email: e.target.value }))} placeholder="you@studio.com" style={inputStyleC} />