Build the full site from the copy decks
Adds About, Contact, Services (index + 8) and Industries (index + 7), generated from structured JSON converted out of the .docx copy decks by scripts/convert-docs.py. Shared header with dropdowns, footer, contact form (mailto until a backend exists), FAQ/breadcrumb JSON-LD, sitemap and robots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
"use client";
|
||||
|
||||
import { useState, type FormEvent } from "react";
|
||||
import { CONTACT_EMAIL, serviceNav } from "@/lib/routes";
|
||||
|
||||
const interests = [...serviceNav.map((s) => s.name), "Not sure yet"];
|
||||
|
||||
// No form backend is wired up yet, so submitting composes an email to the team
|
||||
// in the visitor's mail client. Swap `onSubmit` for a real endpoint when one exists.
|
||||
export default function ContactForm() {
|
||||
const [sent, setSent] = useState(false);
|
||||
|
||||
function onSubmit(e: FormEvent<HTMLFormElement>) {
|
||||
e.preventDefault();
|
||||
const data = new FormData(e.currentTarget);
|
||||
const get = (k: string) => String(data.get(k) ?? "").trim();
|
||||
const subject = `Growth conversation — ${get("company") || get("name")}`;
|
||||
const body = [
|
||||
`Name: ${get("name")}`,
|
||||
`Email: ${get("email")}`,
|
||||
`Company: ${get("company")}`,
|
||||
`Website: ${get("website")}`,
|
||||
`Interested in: ${data.getAll("interest").join(", ") || "—"}`,
|
||||
"",
|
||||
get("message"),
|
||||
].join("\n");
|
||||
window.location.href = `mailto:${CONTACT_EMAIL}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
|
||||
setSent(true);
|
||||
}
|
||||
|
||||
return (
|
||||
<form className="contact-form" onSubmit={onSubmit}>
|
||||
<div className="field-row">
|
||||
<label className="field">
|
||||
<span>Name</span>
|
||||
<input name="name" autoComplete="name" required />
|
||||
</label>
|
||||
<label className="field">
|
||||
<span>Work email</span>
|
||||
<input name="email" type="email" autoComplete="email" required />
|
||||
</label>
|
||||
</div>
|
||||
<div className="field-row">
|
||||
<label className="field">
|
||||
<span>Company</span>
|
||||
<input name="company" autoComplete="organization" />
|
||||
</label>
|
||||
<label className="field">
|
||||
<span>Website</span>
|
||||
<input name="website" type="url" inputMode="url" placeholder="https://" />
|
||||
</label>
|
||||
</div>
|
||||
<fieldset className="field">
|
||||
<legend>What are you looking at?</legend>
|
||||
<div className="chips">
|
||||
{interests.map((i) => (
|
||||
<label key={i} className="chip">
|
||||
<input type="checkbox" name="interest" value={i} />
|
||||
<span>{i}</span>
|
||||
</label>
|
||||
))}
|
||||
</div>
|
||||
</fieldset>
|
||||
<label className="field">
|
||||
<span>What’s happening in the business?</span>
|
||||
<textarea name="message" rows={5} required />
|
||||
</label>
|
||||
<button type="submit" className="btn btn-solid">
|
||||
Send to the Team <span className="arrow">→</span>
|
||||
</button>
|
||||
<p className="form-note" role="status">
|
||||
{sent
|
||||
? `Your email app should have opened with the details. If it didn’t, write to ${CONTACT_EMAIL}.`
|
||||
: `Opens your email app addressed to ${CONTACT_EMAIL}.`}
|
||||
</p>
|
||||
</form>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user