diff --git a/components/ContributeSection.js b/components/ContributeSection.js new file mode 100644 index 0000000..cd30320 --- /dev/null +++ b/components/ContributeSection.js @@ -0,0 +1,79 @@ +import Link from 'next/link' + +// Contribute-for-credits landing SECTION. +// +// Placed after the trust summary (the open-source / trust cluster) because +// this is a commons / flywheel message, not a pricing gimmick: contributions +// strengthen the shared hardening corpus that lowers everyone's +// silent-wrong-effect rate. The full mechanism, expanded guarantees, program +// status, and FAQ live on /contribute. +// +// Framing is binding (see the data-for-credits framing brief): lead with the +// guarantees, never "sell/monetize your data", no per-record price. The +// program is EARLY ACCESS (gated on legal terms), so the copy is "request +// access", never "upload now / available today", and never claims any data has +// been collected. + +const GUARANTEES = [ + 'Sanitized, de-identified derivatives only. Raw recordings never leave your machine.', + 'You approve every byte through hash-bound local review before anything is shared.', + 'Opt-in and off by default. You can stop future contributions at any time.', + 'Every contribution must meet the named de-identification standard in the versioned terms, and your organization attests before sharing.', +] + +export default function ContributeSection() { + return ( +
+
+
+

Strengthen the commons

+ + Early access + +
+

+ Contribute data for credits +

+

+ Every sanitized contribution strengthens the shared + hardening corpus, the commons that lowers everyone's + silent-wrong-effect rate. In return, you earn run credits + that extend your usage allowance. +

+ + + +
+ + Request access to the contributor program + + + Early access. Opt-in. Sanitized derivatives only. + +
+
+
+ ) +} diff --git a/components/ContributorProgramForm.js b/components/ContributorProgramForm.js new file mode 100644 index 0000000..b36fde1 --- /dev/null +++ b/components/ContributorProgramForm.js @@ -0,0 +1,225 @@ +import { useState } from 'react' +import Link from 'next/link' + +import { trackEmailCapture } from 'utils/conversion' + +// Dedicated intake for the contribute-for-credits program. +// +// Posts to the durable Netlify Forms lead path (`/form.html`) under its own +// form name, `contributor-program`, so contributor leads land in their own +// Netlify submissions bucket instead of the generic `contact` queue. The +// hidden form definition lives in public/form.html; Netlify's build-time bots +// read it from there. Registering interest shares only these contact fields; +// it never enables any upload or shares any workflow data. + +const INITIAL_FORM = { + name: '', + email: '', + company: '', + role: '', + workflows: '', + message: '', + botField: '', +} + +export default function ContributorProgramForm() { + const [form, setForm] = useState(INITIAL_FORM) + const [isSubmitting, setIsSubmitting] = useState(false) + const [isSubmitted, setIsSubmitted] = useState(false) + const [error, setError] = useState('') + + const handleChange = (event) => { + const { name, value } = event.target + setForm((prev) => ({ + ...prev, + [name]: value, + })) + } + + const handleSubmit = async (event) => { + event.preventDefault() + setError('') + setIsSubmitting(true) + + try { + const formData = new URLSearchParams() + formData.set('form-name', 'contributor-program') + formData.set('name', form.name) + formData.set('email', form.email) + formData.set('company', form.company) + formData.set('role', form.role) + formData.set('workflows', form.workflows) + formData.set('message', form.message) + formData.set('bot-field', form.botField) + + const response = await fetch('/form.html', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: formData.toString(), + }) + + if (!response.ok) { + throw new Error( + `Form submission failed with status ${response.status}` + ) + } + + // E1 qualified-lead conversion: contributor-program interest + // captured. Carries first-touch utm_* attribution; never any form + // contents. + trackEmailCapture({ location: 'contributor_program_form' }) + setIsSubmitted(true) + } catch (submitError) { + console.error(submitError) + setError( + 'Submission failed. Please email hello@openadapt.ai directly.' + ) + } finally { + setIsSubmitting(false) + } + } + + return ( +
+ {!isSubmitted ? ( +
+ +

+ +

+ +
+ + + + +
+ + + +