// 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 (
); }; // ─── Pricing ──────────────────────────────────────────────────────── const Pricing = ({ lang, navigate }) => { const p = E()[lang].pricing; return (
{p.eyebrow}

{p.title}

{p.lede}

{p.tiers.map((t, i) => (
{t.highlight &&
{p.popular}
}
{t.tag}

{t.name}

{t.price} {t.unit}
    {t.features.map((f, j) => (
  • {f}
  • ))}
{e.preventDefault();navigate&&navigate("contact");}} className={"dm-btn " + (t.highlight ? "dm-btn-primary" : "dm-btn-ghost") + " dm-tier-cta"}> {p.ctaLabel}
))}

{p.note}

); }; // ─── FAQ ──────────────────────────────────────────────────────────── const Faq = ({ lang, navigate }) => { const p = E()[lang].faq; const [open, setOpen] = useStateE(0); return (
{p.eyebrow}

{p.title}

{p.lede}

{e.preventDefault();navigate&&navigate("contact");}} className="dm-btn dm-btn-primary"> {p.ctaLabel}
{p.items.map((it, i) => { const isOpen = open === i; return (

{it.a}

); })}
); }; // ─── Testimonials ──────────────────────────────────────────────────── const Testimonials = ({ lang }) => { const p = E()[lang].testimonials; return (
{p.eyebrow}

{p.title}

{p.lede}

{p.items.map((it, i) => (
{it.quote}
{it.author} {it.role}
))}
); }; Object.assign(window, { DM_Testimonials: Testimonials, DM_Portfolio: Portfolio, DM_Process: Process, DM_Pricing: Pricing, DM_Faq: Faq, DM_ContactFormX: ContactFormX, });