// contact.jsx — formspree-backed inquiry form const { useState: useStateCT } = React; const FORMSPREE_URL = "https://formspree.io/f/mdabvvae"; function Contact() { const [state, setState] = useStateCT("idle"); // idle | sending | ok | error const [errMsg, setErrMsg] = useStateCT(""); const [form, setForm] = useStateCT({ name:"", email:"", company:"", kind:"業務ツール / 自動化", budget:"未定", message:"", ok:false }); const upd = (k) => (e) => setForm({ ...form, [k]: e.target.type === "checkbox" ? e.target.checked : e.target.value }); const onSubmit = async (e) => { e.preventDefault(); if (state === "sending") return; if (!form.ok) { setErrMsg("プライバシー方針への同意が必要です"); return; } setState("sending"); setErrMsg(""); try { const res = await fetch(FORMSPREE_URL, { method:"POST", headers:{ "Accept":"application/json", "Content-Type":"application/json" }, body: JSON.stringify({ お名前: form.name, メール: form.email, 会社名: form.company, ご相談内容の種類: form.kind, ご予算感: form.budget, ご相談内容: form.message }) }); if (res.ok) setState("ok"); else { const j = await res.json().catch(()=>({})); setErrMsg(j?.error || "送信に失敗しました。少し時間をおいて再度お試しください。"); setState("error"); } } catch(err){ setErrMsg("通信エラーが発生しました。"); setState("error"); } }; const fld = { background:"var(--surface)", border:"1px solid var(--line-2)", borderRadius:12, padding:"15px 17px", color:"var(--text)", fontFamily:"var(--body)", fontSize:15.5, width:"100%", outline:"none", transition:"border-color .15s" }; const lbl = { fontSize:12.5, fontWeight:600, color:"var(--text-2)", marginBottom:9, display:"flex", alignItems:"center", gap:8, fontFamily:"var(--mono)", letterSpacing:"0.04em", textTransform:"uppercase" }; const req = *REQUIRED; return (
10 / CONTACT

気になったら、まずは投げてみてください。

30秒で送れます。箇条書きで構いません。
対応可否と概算感は、できるだけ早くお返しします。
迷うのは、お互いに時間のムダなので。

{[ ["完全無料","ヒアリング・お見積もりまで費用は発生しません"], ["返信目安","通常 1〜2 営業日以内(土日は遅れる場合があります)"], ["対応エリア","オンライン中心 / 全国・海外OK"] ].map(([k,v]) => (
{k.toUpperCase()}
{v}
))}
{state === "ok" ? (

送信ありがとうございました

内容を確認のうえ、1〜2営業日以内にご記入のメールアドレスへご連絡します。
迷惑メールフォルダに入ることがあるのでご確認ください。

) : (
お名前 {req}
メール {req}
会社名・屋号 OPTIONAL
ご相談内容の種類
ご予算感
ご相談内容 {req}
{state === "error" &&
{errMsg}
}
FORM POWERED BY FORMSPREE · SSL ENCRYPTED
)}
); } Object.assign(window, { Contact });