// Shared primitives, data, and the VergabePilot wordmark logo (original, not the site's SVG) const VP_COLORS = { ink: 'oklch(0.22 0.02 250)', inkSoft: 'oklch(0.42 0.02 250)', inkMuted: 'oklch(0.58 0.015 250)', paper: 'oklch(0.985 0.004 80)', paperWarm: 'oklch(0.965 0.012 80)', line: 'oklch(0.90 0.01 250)', lineSoft: 'oklch(0.94 0.008 250)', accent: 'oklch(0.52 0.17 255)', // blue accentDeep: 'oklch(0.38 0.16 255)', accentSoft: 'oklch(0.95 0.04 255)', success: 'oklch(0.62 0.14 155)', warn: 'oklch(0.70 0.15 75)', }; // Original wordmark — paper plane glyph + "Vergabepilot.AI" function Logo({ variant = 'dark', size = 22 }) { const fg = variant === 'dark' ? VP_COLORS.ink : '#fff'; const accent = VP_COLORS.accent; const src = variant === 'dark' ? 'https://www.vergabepilot.ai/logo.svg' : 'https://www.vergabepilot.ai/logo-light.svg'; return (
Vergabepilot.AI Vergabepilot.AI
); } // Team portraits — photo if provided, otherwise initials placeholder function HostAvatar({ name, color, photo, size = 56 }) { const initials = name.split(' ').map(n => n[0]).join('').slice(0, 2); if (photo) { return (
); } return (
{initials}
); } const HOSTS = [ { name: 'Marko Jeftic', role: 'Geschäftsführer', color: 'oklch(0.50 0.14 245)', photo: 'https://cdn.prod.website-files.com/6489ddd1c152234a91b82b55/653a7cb02b6123098f6196d4_Marko.webp' }, { name: 'Phillip Fuchs', role: 'Sales', color: 'oklch(0.45 0.12 150)', photo: 'https://cdn.prod.website-files.com/6489ddd1c152234a91b82b55/68a1b5f0af68326b3a2d5d45_f4b2ad82-cc8d-408a-9c53-6d83fd4dd6f2.jpg' }, { name: 'Louis Krall', role: 'Marketing', color: 'oklch(0.55 0.16 30)', photo: 'https://cdn.prod.website-files.com/6489ddd1c152234a91b82b55/68a4615d65f0a88e7b209716_img-20250706-wa0001_1_-photoroom.png' }, ]; const BULLETS = [ 'Ausschreibungen aus 300+ öffentlichen Vergabeportalen automatisiert durchsuchen', 'Keine relevanten Ausschreibungen mehr verpassen, dank KI-Suche', 'Vergaben schnell und strukturiert in wenigen Minuten bewerten', 'Fragen direkt im Webinar klären', 'Kostenlose 2-wöchige Testphase möglich', ]; const STATS = [ { n: '300+', l: 'Vergabeportale integriert' }, { n: '10.000+', l: 'Aktive Ausschreibungen' }, { n: '500+', l: 'Neue Ausschreibungen / Tag' }, { n: '< 5 Min', l: 'Go / No-Go-Entscheidung' }, ]; const TESTIMONIALS = [ { quote: 'Die Suche nach Ausschreibungen war für uns faktisch eine Vollzeitaufgabe. Mit Vergabepilot.AI ist sie es nicht mehr.', name: 'Dr. Maximilian Lerch', company: 'IFB Eigenschenk GmbH', color: 'oklch(0.48 0.13 230)', photo: 'https://cms.vergabepilot.ai/api/media/file/maximilian-lerch-ifb.jpeg', }, { quote: 'Mit Vergabepilot sehen wir rund 75 % weniger irrelevante Ergebnisse, bearbeiten aber deutlich mehr passende Ausschreibungen.', name: 'Marcus Landschof', company: 'Sinus Nachrichtentechnik GmbH', color: 'oklch(0.50 0.14 60)', photo: 'https://cms.vergabepilot.ai/api/media/file/Marcus%20Landschof.jpg', }, { quote: 'Eine der besten und sinnvollsten Umsetzungen von KI im Vertriebsbereich.', name: 'Axel Hengemuehle', company: 'Venn Telecom', color: 'oklch(0.48 0.15 340)', photo: 'https://cms.vergabepilot.ai/api/media/file/Axel%20Hengemuehle.jpeg', }, ]; const FAQS = [ { q: 'Ist das Webinar wirklich kostenlos?', a: 'Ja, die Teilnahme ist zu 100 % kostenlos und unverbindlich. Du erhältst nach der Anmeldung den Zugangslink per E-Mail.' }, { q: 'Bekomme ich die Aufzeichnung?', a: 'Alle angemeldeten Teilnehmer erhalten im Nachgang automatisch den Link zur Aufzeichnung – auch wenn du live nicht dabei sein kannst.' }, { q: 'Wie lange dauert das Webinar?', a: 'Rund 45 Minuten Live-Demo und Produktvorstellung, anschließend 15 Minuten für deine Fragen.' }, { q: 'Für wen ist das Webinar geeignet?', a: 'Für Unternehmen im B2B-Umfeld, die regelmäßig auf öffentliche Ausschreibungen bieten oder einsteigen möchten – Vertrieb, Geschäftsführung, Business Development.' }, { q: 'Brauche ich Vorwissen?', a: 'Nein. Wir zeigen die Plattform von Grund auf – sowohl für Einsteiger als auch erfahrene Bieter ist die Session relevant.' }, ]; // --- Registration form (shared across hero variants) --- function RegistrationForm({ compact = false, onSubmit, inverse = false, formId }) { const [state, setState] = React.useState({ firstName: '', lastName: '', email: '', company: '', consent: false }); const [status, setStatus] = React.useState('idle'); // idle | submitting | done const [errors, setErrors] = React.useState({}); const validate = () => { const e = {}; if (!state.firstName.trim()) e.firstName = 'Bitte ausfüllen'; if (!state.lastName.trim()) e.lastName = 'Bitte ausfüllen'; if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(state.email)) e.email = 'Gültige E-Mail nötig'; if (!state.company.trim()) e.company = 'Bitte ausfüllen'; if (!state.consent) e.consent = 'Zustimmung erforderlich'; return e; }; const submit = (ev) => { ev.preventDefault(); const e = validate(); setErrors(e); if (Object.keys(e).length) return; setStatus('submitting'); setTimeout(() => { setStatus('done'); if (onSubmit) onSubmit(state); }, 900); }; if (status === 'done') { return (
Du bist angemeldet.
Wir haben dir eine Bestätigung an {state.email} geschickt. Du erhältst kurz vor dem Webinar den Zugangslink.
); } const fieldStyle = (hasError) => ({ width: '100%', padding: '11px 13px', fontSize: 14.5, fontFamily: "'Inter', sans-serif", border: `1px solid ${hasError ? 'oklch(0.60 0.18 25)' : (inverse ? 'rgba(255,255,255,.22)' : VP_COLORS.line)}`, borderRadius: 8, background: inverse ? 'rgba(255,255,255,.06)' : '#fff', color: inverse ? '#fff' : VP_COLORS.ink, outline: 'none', transition: 'border-color .15s, box-shadow .15s', boxSizing: 'border-box', }); const labelStyle = { display: 'block', fontSize: 12, fontWeight: 500, color: inverse ? 'rgba(255,255,255,.75)' : VP_COLORS.inkSoft, marginBottom: 6, letterSpacing: '0.01em', }; return (
setState(s => ({ ...s, firstName: e.target.value }))} placeholder="Max" />
setState(s => ({ ...s, lastName: e.target.value }))} placeholder="Mustermann" />
setState(s => ({ ...s, email: e.target.value }))} placeholder="max@unternehmen.de" />
setState(s => ({ ...s, company: e.target.value }))} placeholder="Unternehmen GmbH" />
100 % KOSTENLOS · KEINE KREDITKARTE · DSGVO-KONFORM
); } // Shared countdown target: 29 May 2026, 11:00 CET (Central European Time = UTC+1 in May -> CEST actually UTC+2) // 29 May 2026 11:00 Europe/Berlin = 09:00 UTC const WEBINAR_TARGET_MS = Date.UTC(2026, 4, 29, 9, 0, 0); const WEBINAR_LABEL = '29. Mai 2026 · 11:00 Uhr (MESZ)'; const WEBINAR_LABEL_SHORT = '29. MAI · 11:00'; function useCountdown(targetMs) { const [now, setNow] = React.useState(Date.now()); React.useEffect(() => { const id = setInterval(() => setNow(Date.now()), 1000); return () => clearInterval(id); }, []); const diff = Math.max(0, targetMs - now); return { days: Math.floor(diff / 86400000), hrs: Math.floor((diff % 86400000) / 3600000), mins: Math.floor((diff % 3600000) / 60000), secs: Math.floor((diff % 60000) / 1000), done: diff === 0, }; } function CountdownLight() { const { days, hrs, mins, secs } = useCountdown(WEBINAR_TARGET_MS); const Cell = ({ n, l }) => (
{String(n).padStart(2, '0')}
{l}
); return (
: : :
); } Object.assign(window, { VP_COLORS, Logo, HostAvatar, HOSTS, BULLETS, STATS, TESTIMONIALS, FAQS, RegistrationForm, WEBINAR_TARGET_MS, WEBINAR_LABEL, WEBINAR_LABEL_SHORT, useCountdown, CountdownLight, });