'use client'; import { Input, Label, Textarea } from '@/components/input'; import { Button } from '@/components/ui/button'; import { apiFetch } from '@/lib/api'; import Link from 'next/link'; import { useState } from 'react'; export default function ContactPage() { const [email, setEmail] = useState(''); const [subject, setSubject] = useState(''); const [body, setBody] = useState(''); const [state, setState] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle'); const [error, setError] = useState(null); async function submit(e: React.FormEvent) { e.preventDefault(); setState('sending'); setError(null); try { await apiFetch('/v1/contact', { method: 'POST', body: JSON.stringify({ email, subject, body }), }); setState('sent'); } catch (err) { setState('error'); const detail = (err as { detail?: { detail?: string; error?: string } }).detail; setError(detail?.detail ?? detail?.error ?? (err as Error).message); } } if (state === 'sent') { return (

Message received

Thank you — we got your message. We'll reply to{' '} {email} within one business day.

← Back to home

); } return (
Contact

Talk to us

We don't do public email — every conversation runs through our internal support panel so nothing gets lost. Already have an account?{' '} Open a ticket from inside .

setEmail(e.target.value)} placeholder="you@company.com" />
setSubject(e.target.value)} placeholder="Briefly — what's this about?" />