// DemoRequestForm.jsx // // The one real lead-capture form every "Request a Demo" CTA on the site // points to. Posts multipart/form-data to /api/mail-handler.php (PHP + // PHPMailer over SMTP, delivering into the real Google Workspace mailbox - // see api/SETUP.md), not JSON to a placeholder endpoint - that's now a // real, working backend, not forward-wired. FormData (not JSON) so this // form and CareerApplicationForm.jsx share one submission shape, since the // career form needs real file upload support and both hit the same // endpoint. // // Because the backend is real now, this form surfaces real errors instead // of always showing success - the previous "fake success no matter what" // behavior was specifically because no backend existed yet to fail against // (see git history / prior session notes); showing a false success on a // genuine send failure would now be actively misleading. // // Spam guards, three layers: a honeypot field (visually hidden, tab-order // excluded), a time-trap (elapsed ms since mount, re-checked server-side), // and Cloudflare Turnstile (invisible, deferred to submit time via // `execution: "execute"` so the token is always fresh, not one grabbed at // mount and possibly stale by the time a slow filler submits). The // Turnstile script and widget are managed entirely inside this component // via a mount effect - no