// desidium-join.jsx — "Become an AI model" / Work-with-us page, exported to window const { useState: useStateJ, useRef: useRefJ, useEffect: useEffectJ } = React; function JoinPage({ lang, motion, onApply }) { const j = I18N.join; useEffectJ(() => { window.scrollTo(0, 0); }, []); return (
{/* HERO */}
{L(j.kicker, lang)}

{L(j.h1a, lang)} {L(j.h1b, lang)}

{L(j.sub, lang)}

{/* WHAT IT MEANS */}
{L(j.whatLabel, lang)}

{L(j.whatLede, lang)}

{L(j.whatNote, lang)}

{/* HOW IT WORKS */}
{L(j.stepsLabel, lang)}
{j.steps.map((s, i) => (
{s.no}

{L(s.t, lang)}

{L(s.d, lang)}

))}
{/* WHY + ELIGIBILITY */}
{L(j.whyLabel, lang)}
{j.why.map((w, i) => (
{String(i+1).padStart(2,"0")}

{L(w.t, lang)}

{L(w.d, lang)}

))}
{L(j.eligLabel, lang)}
    {j.elig.map((e, i) => ( {String(i+1).padStart(2,"0")} {L(e, lang)} ))}
{/* APPLICATION FORM */}
); } /* ---------------- APPLICATION FORM ---------------- */ function ApplyForm({ lang, motion }) { const j = I18N.join; const [form, setForm] = useStateJ({ name:"", email:"", city:"", links:"", langs:"", niche:"fashion", bio:"" }); const [photos, setPhotos] = useStateJ([]); // {id, url, name} const [consent, setConsent] = useStateJ(false); const [errors, setErrors] = useStateJ({}); const [state, setState] = useStateJ("idle"); // idle | sending | sent const [drag, setDrag] = useStateJ(false); const inputRef = useRefJ(null); const set = (f) => (e) => setForm({ ...form, [f]: e.target.value }); const addFiles = (fileList) => { const files = [...fileList].filter((f) => f.type.startsWith("image/")).slice(0, 4 - photos.length); files.forEach((file) => { const reader = new FileReader(); reader.onload = (ev) => { setPhotos((prev) => prev.length >= 4 ? prev : [...prev, { id: Math.random().toString(36).slice(2), url: ev.target.result, name: file.name }]); }; reader.readAsDataURL(file); }); }; const onDrop = (e) => { e.preventDefault(); setDrag(false); if (e.dataTransfer.files) addFiles(e.dataTransfer.files); }; const removePhoto = (id) => setPhotos((prev) => prev.filter((p) => p.id !== id)); const makeCover = (id) => setPhotos((prev) => { const i = prev.findIndex((p)=>p.id===id); if (i<=0) return prev; const c=[...prev]; const [x]=c.splice(i,1); c.unshift(x); return c; }); const submit = (e) => { e.preventDefault(); const er = {}; ["name","email","bio"].forEach((f) => { if (!form[f].trim()) er[f] = true; }); if (form.email && !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(form.email)) er.email = true; if (!photos.length) er.photos = true; if (!consent) er.consent = true; setErrors(er); if (Object.keys(er).length) return; setState("sending"); setTimeout(() => setState("sent"), 1200); }; if (state === "sent") { return (

{L(j.sent_t, lang)}

{L(j.sent_d, lang)}

); } return (
{L(j.formLabel, lang)}

{L(j.formTitle, lang)}

{L(j.formSub, lang)}

{errors.name && {L(j.err, lang)}}
{errors.email && {L(j.err, lang)}}
{j.niche_opts.map((o) => ( ))}
{errors.bio && {L(j.err, lang)}}
{/* PHOTO UPLOAD */}
{L(j.photos_hint, lang)}
{photos.map((p, i) => (
{p.name} {i === 0 && {L(j.primary, lang)}}
{i !== 0 && }
))} {photos.length < 4 && ( )}
{ addFiles(e.target.files); e.target.value=""; }} /> {errors.photos && {L(j.err_photo, lang)}}
{/* CONSENT */}
{L(j.consent, lang)}
{errors.consent && {L(j.err_consent, lang)}}
); } Object.assign(window, { JoinPage });