// sc-contact.jsx — 無料トライアル / お問い合わせ (Formspree)
// ⚠️ Formspree の送信先URLをここで設定してください
// https://formspree.io で登録後、YOUR_FORM_ID を実際のIDに差し替え
const FORMSPREE_URL = "https://formspree.io/f/xojyrzyl";
function ContactPage({ navigate }) {
const PageHero = () => (
Free Trial
1週間
無料トライアル
まずは体感してください。
フォームに入力いただくと、担当コーチよりご連絡します。
);
/* ── Contact Form ── */
const ContactForm = () => {
const [status, setStatus] = React.useState("idle"); // idle | sending | success | error
const [form, setForm] = React.useState({
name: "", email: "", phone: "", business: "",
_honeypot: "", // ボット対策:人間は入力しない隠しフィールド
});
const submitTime = React.useRef(Date.now());
const [errors, setErrors] = React.useState({});
const validate = () => {
const e = {};
if (!form.name.trim()) e.name = "お名前を入力してください";
if (!form.email.trim()) e.email = "メールアドレスを入力してください";
else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.email)) e.email = "正しいメールアドレスを入力してください";
if (!form.phone.trim()) e.phone = "電話番号を入力してください";
if (!form.business) e.business = "事業の状況を選択してください";
return e;
};
const handleChange = (k, v) => {
setForm(f => ({ ...f, [k]: v }));
if (errors[k]) setErrors(e => ({ ...e, [k]: undefined }));
};
const handleSubmit = async (ev) => {
ev.preventDefault();
const e = validate();
if (Object.keys(e).length > 0) { setErrors(e); return; }
// ハニーポット:隠しフィールドが埋まっていたらボットとみなす
if (form._honeypot) { setStatus("success"); return; }
// 送信が速すぎる場合もボットとみなす(3秒未満)
if (Date.now() - submitTime.current < 3000) { setStatus("success"); return; }
setStatus("sending");
try {
const res = await fetch(FORMSPREE_URL, {
method: "POST",
headers: { "Content-Type": "application/json", "Accept": "application/json" },
body: JSON.stringify({
name: form.name,
email: form.email,
phone: form.phone || "(未入力)",
business: form.business,
}),
});
if (res.ok) setStatus("success");
else setStatus("error");
} catch {
setStatus("error");
}
};
const inputStyle = (hasErr) => ({
width: "100%", fontFamily: "var(--font-sans)", fontSize: "15px",
color: "var(--text)", background: "#fff",
border: `1.5px solid ${hasErr ? "#e05252" : "var(--border)"}`,
borderRadius: "2px", padding: "14px 16px", outline: "none",
transition: "border-color 0.2s",
});
const labelStyle = {
fontFamily: "var(--font-sans)", fontSize: "13px", fontWeight: 500,
color: "var(--text)", marginBottom: "8px", display: "flex",
alignItems: "center", gap: "6px",
};
const Required = () => (
必須
);
const Optional = () => (
任意
);
const ErrorMsg = ({ msg }) => msg ? (
⚠ {msg}
) : null;
const businessOptions = [
{ value: "before", label: "起業前・準備中" },
{ value: "freelance", label: "起業済み・個人事業主" },
{ value: "corporation", label: "法人経営者" },
];
if (status === "success") {
return (
✓
Sent Successfully
送信が完了しました
ご連絡ありがとうございます。
担当コーチより、通常1〜2営業日以内にご連絡いたします。
しばらくお待ちください。
);
}
return (
{/* Left: explanation */}
Apply Now
まずは、
無料で試してください。
フォームを送信いただくと、担当コーチより通常1〜2営業日以内にご連絡いたします。初回セッションで、現在の状況と課題をお伺いします。
{[
{ icon: "📋", text: "タスクの洗い出しとアクションプランを初回で設定" },
{ icon: "📱", text: "毎日の進捗確認メッセージでサボれない環境を構築" },
{ icon: "🎯", text: "週次オンラインセッションで方向性を常にアップデート" },
].map((item, i) => (
))}
{/* Right: form */}
);
};
const FAQ = () => {
const [open, setOpen] = React.useState(null);
const faqs = [
{ q: "無料トライアルに費用はかかりますか?", a: "1週間の無料トライアルは完全無料です。費用は一切かかりません。トライアル終了後、継続をご希望の場合のみ、別途ご案内いたします。" },
{ q: "どのような方が対象ですか?", a: "起業家、経営者、個人事業主、副業で事業を進めている方など、ビジネスを前進させたい方であれば幅広く対応しています。事業規模は問いません。" },
{ q: "連絡はメール以外でも可能ですか?", a: "メール、LINE、電話など、ご都合に合わせた方法でご対応しています。ご希望の連絡方法をお知らせください。" },
{ q: "オンラインセッションの所要時間は?", a: "1回あたり60〜90分程度を目安にしています。状況に応じて柔軟に対応しています。" },
{ q: "IT・パソコンが苦手でも大丈夫ですか?", a: "もちろんです。ツールの使い方から丁寧にサポートします。ITが苦手な方でも安心してご利用いただけます。" },
];
return (
{faqs.map((f, i) => (
))}
);
};
return (
);
}
window.ContactPage = ContactPage;