// Portfolio + Process + enhanced Contact form components const { useState: useStateE } = React; const E = () => window.DM_EXTRAS; // ─── Portfolio ─────────────────────────────────────────────────────── const Portfolio = ({ lang }) => { const p = E()[lang].portfolio; const [active, setActive] = useStateE(0); const item = p.items[active]; return (
{p.eyebrow}

{p.title}

{p.lede}

{p.items.map((it, i) => ( ))}
{item.industry}

{item.title}

{item.result}

{item.desc}

{item.tags.map((tg, i) => {tg})}
); }; // ─── Process ──────────────────────────────────────────────────────── const Process = ({ lang }) => { const p = E()[lang].process; return (
{p.eyebrow}

{p.title}

{p.lede}

    {p.steps.map((s, i) => (
  1. {s.n}

    {s.title}

    {s.desc}

    {i < p.steps.length - 1 &&
  2. ))}
); }; // ─── Enhanced Contact Form ────────────────────────────────────────── const ContactFormX = ({ lang, navigate }) => { const t = window.DM_I18N[lang]; const ex = E()[lang].contactExtra; const p = t.pages.contact; const [values, setValues] = useStateE({ name: "", email: "", subject: "", message: "", consent: false }); const [errors, setErrors] = useStateE({}); const [sent, setSent] = useStateE(false); const [submitting, setSubmitting] = useStateE(false); const set = (k) => (e) => { const v = e.target.type === "checkbox" ? e.target.checked : e.target.value; setValues((s) => ({ ...s, [k]: v })); if (errors[k]) setErrors((s) => ({ ...s, [k]: null })); }; const validate = () => { const e = {}; if (!values.name.trim()) e.name = ex.errors.name; if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(values.email)) e.email = ex.errors.email; if (!values.message.trim() || values.message.trim().length < 5) e.message = ex.errors.message; return e; }; const submit = (e) => { e.preventDefault(); const errs = validate(); if (Object.keys(errs).length) { setErrors(errs); return; } setSubmitting(true); setTimeout(() => { setSubmitting(false); setSent(true); }, 700); }; if (sent) { return (

{ex.successTitle}

{ex.successDesc}

); } return (
); }; Object.assign(window, { DM_Portfolio: Portfolio, DM_Process: Process, DM_ContactFormX: ContactFormX, });