/* global React, Reveal, TypeReveal, Marquee */ function ServicesPage({ t, setPage }) { return ( <> — {t.nav.services} / 2026 {t.services_page.sub} {t.services_page.details.map((d, i) => ( {d.num} {d.title} {d.body} {d.deliverables.map((dv, j) => {dv})} ))} {t.cta.headline_a} {t.cta.headline_b} {t.cta.headline_c} { e.preventDefault(); setPage('contact'); }}> {t.cta.btn} → > ); } function AboutPage({ t, setPage }) { const ap = t.about_page; return ( <> — {ap.eyebrow} {ap.lead} {ap.lead2} {ap.values_eyebrow} {ap.values_title} {ap.values.map((v, i) => ( {v.num} {v.title} {v.desc} ))} {ap.team_eyebrow} {ap.team_title} {ap.team_desc} {ap.team.map((m, i) => ( [ portrait · {m.name.split(' ')[0].toLowerCase()} ] {m.name} {m.role} ))} {t.cta.headline_a} {t.cta.headline_b} {t.cta.headline_c} { e.preventDefault(); setPage('contact'); }}> {t.cta.btn} → > ); } function ContactPage({ t }) { const cp = t.contact_page; const [form, setForm] = React.useState({ name: '', company: '', email: '', message: '', budget: '', services: [] }); const [sent, setSent] = React.useState(false); const updateField = (k, v) => setForm(f => ({...f, [k]: v})); const toggleService = (s) => setForm(f => ({ ...f, services: f.services.includes(s) ? f.services.filter(x => x !== s) : [...f.services, s] })); const submit = (e) => { e.preventDefault(); setSent(true); setTimeout(() => setSent(false), 4000); }; return ( <> — {cp.eyebrow} {cp.sub} {cp.info.map((info, i) => ( {info.k} {info.v} ))} {cp.form.name} updateField('name', e.target.value)} required /> {cp.form.company} updateField('company', e.target.value)} /> {cp.form.email} updateField('email', e.target.value)} required /> {cp.form.services} {cp.form.services_chips.map((s, i) => ( toggleService(s)}> {s} ))} {cp.form.budget} {cp.form.budget_chips.map((b, i) => ( updateField('budget', b)}> {b} ))} {cp.form.message} updateField('message', e.target.value)} required /> {sent ? cp.form.sent : cp.form.submit} → > ); } Object.assign(window, { ServicesPage, AboutPage, ContactPage });
{t.services_page.sub}
{d.body}
{ap.lead}
{ap.lead2}
{v.desc}
{ap.team_desc}
{cp.sub}