/* ea-contact.jsx — Contact page for the Luppy Early-Access site. Same content/behavior as contact.jsx, but shares EANav / EAFooter (early-access.jsx) so chrome matches the rest of the pre-launch site. */ (function () { const { useState } = React; const TOPICS = [ { id: 'sales', label: 'Sales' }, { id: 'support', label: 'Support' }, { id: 'billing', label: 'Billing' }, { id: 'partnership', label: 'Partnership' }, { id: 'press', label: 'Press' }, { id: 'other', label: 'Other' }, ]; const EMPTY_FORM = { name: '', email: '', company: '', size: '', message: '', company_website: '' }; function ContactForm() { const [form, setForm] = useState(EMPTY_FORM); const [topic, setTopic] = useState('sales'); const [sending, setSending] = useState(false); const [error, setError] = useState(''); const [sent, setSent] = useState(null); // { name, email, topic } const set = (k) => (e) => setForm((f) => ({ ...f, [k]: e.target.value })); const canSend = form.name.trim() && form.email.trim() && form.message.trim(); const send = async (e) => { e.preventDefault(); if (!canSend || sending) return; setError(''); setSending(true); try { await submitForm({ form: 'contact', topic, name: form.name.trim(), email: form.email.trim(), company: form.company.trim(), size: form.size, message: form.message.trim(), company_website: form.company_website, }); setSent({ name: form.name.trim(), email: form.email.trim(), topic }); setForm(EMPTY_FORM); } catch (err) { setError(err.message); } finally { setSending(false); } }; if (sent) { return (

Message sent!

Thanks, {sent.name.split(' ')[0] || 'there'} — your message is on its way to our{' '} {TOPICS.find((t) => t.id === sent.topic)?.label.toLowerCase()} team. We'll reply to{' '} {sent.email || 'your inbox'} within one business day.

); } return (

Send us a message

Fill this in and the right person will get back to you — usually within a few hours.

{TOPICS.map((t) => ( ))}
{/* honeypot — hidden from people, catnip for bots */} {error &&
{error}
}
We'll never share your details. No spam, ever.
); } function ContactAside() { const methods = [ { ic: 'solar:rocket-2-bold', cls: 'm-primary', t: 'Join early access', d: 'Want in before we open to the public? Grab your spot on the early-access list.', onClick: () => openJoinModal(), label: 'Join early access', }, { ic: 'solar:chat-round-dots-bold', cls: 'm-success', t: 'Questions about early access', d: 'Not sure Luppy is a fit yet, or want to know what happens after you sign up? Ask us.', link: 'mailto:hello@luppy.app', label: 'hello@luppy.app', }, { ic: 'solar:letter-bold', cls: 'm-info', t: 'Press & partnerships', d: 'Writing about early-stage tools for cleaning businesses, or want to partner? Reach out.', link: 'mailto:press@luppy.app', label: 'press@luppy.app', }, ]; return (

Ways to reach us

{methods.map((m, i) => (

{m.t}

{m.d}

{m.onClick ? : {m.label} }
))}
Reply time
Within one business day
Based in
Georgia, USA
Status
Building in early access
); } function EAContactPage() { return (
Contact

Talk to a human.

Questions about Luppy, early access, or whether it fits your cleaning business? We're a quick message away — and a real person always answers.

); } ReactDOM.createRoot(document.getElementById('root')).render(); })();