// 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.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) => (
-
{s.n}
{s.title}
{s.desc}
{i < p.steps.length - 1 && }
))}
);
};
// ─── 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,
});