const DS4 = window.IseeITDesignSystem_37fb1f;
// Auf Modulebene, nicht im Kontakt-Render definiert: sonst bekommt React bei jedem
// Tastenanschlag einen neuen Komponententyp und baut die Fotos neu auf (Flackern).
const KZ = ({ label, children }) =>
{label}
{children}
;
const KPerson = ({ bild, name, rolle }) =>
{bild ? : }
{name}{rolle}
;
function Fragen() {
const { t } = React.useContext(window.SpracheCtx);
const f = t.fragen;
const [alle, setAlle] = React.useState(false);
const [hov, setHov] = React.useState(false);
const letzte = f.qa[f.qa.length - 1];
return {f.kicker}
{f.titel}
{/* Die wichtigste Antwort steht: eine Kachel als Brücke zum Formular. Die übrigen Fragen liegen zusammengeklappt darunter. */}
{letzte.f}
{f.nutzen ?
{window.FETT(f.nutzen.lead)}
{f.nutzen.schluss}
:
{window.FETT(letzte.a)}
}
{f.qa.slice(0, -1).map((q, i) =>
{window.FETT(q.a)}
)}
;
}
function Kontakt({ onGoto }) {
const { t } = React.useContext(window.SpracheCtx);
const k = t.kontakt;
const weit = window.useMedia('(min-width: 760px)');
const laeuftMit = window.useMedia('(min-width: 1000px)');
const [status, setStatus] = React.useState('offen'); // offen | sendet | danke | mailweg
const [t0] = React.useState(() => Date.now());
const [f, setF] = React.useState({ name: '', mail: '', fokus: '', land: '', profil: '', links: [], nachricht: '', firma: '', ok: false });
const [datei, setDatei] = React.useState(null);
const [dateiFehler, setDateiFehler] = React.useState('');
const [schluessel, setSchluessel] = React.useState(0);
// Vorwahl aus den Weg-Kacheln („Ihr Weg nach Deutschland" / „in die Schweiz"): das Zielland steht schon im Formular.
React.useEffect(() => {
const f = (e) => { const land = e && e.detail && e.detail.land; if (land) setF(v => ({ ...v, land })); };
window.addEventListener('kontakt-vorwahl', f);
return () => window.removeEventListener('kontakt-vorwahl', f);
}, []);
const set = (kk) => (e) => setF({ ...f, [kk]: e.target.type === 'checkbox' ? e.target.checked : e.target.value });
const setLink = (i) => (e) => setF(v => { const l = v.links.slice(); l[i] = e.target.value; return { ...v, links: l }; });
const linkWeg = (i) => () => setF(v => ({ ...v, links: v.links.filter((_, j) => j !== i) }));
const linkDazu = () => setF(v => v.links.length >= 3 ? v : { ...v, links: v.links.concat('') });
// Anhang: nur PDF und Word, höchstens 4 MB. Geprüft wird hier für die Rechenzeit des
// Besuchers und ein zweites Mal auf dem Server — dort zählt allein die Serverprüfung.
const dateiWaehlen = (e) => {
const d = e.target.files && e.target.files[0];
setDateiFehler(''); setDatei(null);
if (!d) return;
if (!/\.(pdf|doc|docx)$/i.test(d.name)) { setDateiFehler(k.form.cvTyp); e.target.value = ''; return; }
if (d.size > 4 * 1024 * 1024) { setDateiFehler(k.form.cvGross); e.target.value = ''; return; }
const r = new FileReader();
r.onload = () => setDatei({ name: d.name, groesse: d.size, daten: String(r.result).split(',')[1] || '' });
r.onerror = () => { setDateiFehler(k.form.cvFehler); e.target.value = ''; };
r.readAsDataURL(d);
};
const dateiWeg = () => { setDatei(null); setDateiFehler(''); setSchluessel(n => n + 1); };
// Die linke Spalte („06 Schreiben Sie uns", Titel, Ansprechpartner) bleibt unter der
// Kopfzeile verankert, während das Formular rechts weiterläuft: Der Abschnittsanfang
// ist immer im Blick — genau wie beim Aufsetzen der Sektion.
const mailOk = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(f.mail.trim());
const ready = f.name && mailOk && f.ok;
const absenden = () => {
if (status === 'sendet') return;
setStatus('sendet');
const links = f.links.map(s => s.trim()).filter(Boolean);
const ctrl = new AbortController();
const timer = setTimeout(() => ctrl.abort(), datei ? 30000 : 8000);
fetch('kontakt.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: f.name, mail: f.mail, fokus: f.fokus, land: f.land, profil: f.profil, links, nachricht: f.nachricht, firma: f.firma, t0, datei: datei ? { name: datei.name, daten: datei.daten } : null }), signal: ctrl.signal })
.then(r => r.json().then(j => { if (!r.ok || !j.ok) throw new Error('senden'); setStatus('danke'); }))
.catch(() => {
// Rückfallweg ohne Server: E-Mail-Programm mit fertiger Nachricht öffnen.
const betreff = encodeURIComponent('Kontakt: ' + f.name + (f.fokus ? ' · ' + f.fokus : '') + (f.land ? ' → ' + f.land : ''));
const rumpf = encodeURIComponent('Name: ' + f.name + '\nE-Mail: ' + f.mail + (f.fokus ? '\nFachgebiet: ' + f.fokus : '') + (f.land ? '\nZielland: ' + f.land : '') + (f.profil ? '\nProfil: ' + f.profil : '') + (links.length ? '\nWeitere Links: ' + links.join(' · ') : '') + (datei ? '\n\n' + k.form.mailAnhang : '') + (f.nachricht ? '\n\n' + f.nachricht : ''));
window.location.href = 'mailto:info@iseeit-talent.de?subject=' + betreff + '&body=' + rumpf;
setStatus('mailweg');
})
.finally(() => clearTimeout(timer));
};
const offen = [!f.name && k.form.offenFelder[0], !mailOk && k.form.offenFelder[1], !f.ok && k.form.offenFelder[4]].filter(Boolean).join(', ');
return
: null;
// Gegenüberstellung wie auf dem Onepager: links, was Sie bekommen; rechts, was es kostet.
const Paar = ({ linksTitel, links, rechtsTitel, rechts }) =>
{linksTitel}
{links}
{rechtsTitel}
{rechts}
;
// Fließtext als ruhige Liste: ein Satz, eine Zeile.
const Saetze = ({ text }) =>