import React, { useState, useRef } from 'react'; import { Link } from '@/spa/router'; import { Upload, FileText, CheckCircle, AlertCircle, X, ArrowRight, Clock, Shield, Info } from 'lucide-react'; import { useIsMobile } from '@/spa/hooks/useIsMobile'; const FF = '"IBM Plex Sans", sans-serif'; const GOLD = '#EFBF04'; const NAVY = '#111D55'; const DARK = '#101828'; const GRAU = '#E4E2E3'; const BORDER = '#D0D5DD'; const HELLBLAU = '#4A8FC9'; type UploadFile = { name: string; size: number; status: 'ready' | 'uploading' | 'done' | 'error' }; function formatBytes(b: number) { if (b < 1024) return b + ' B'; if (b < 1024 * 1024) return (b / 1024).toFixed(1) + ' KB'; return (b / (1024 * 1024)).toFixed(1) + ' MB'; } export default function FormularUpload() { const [files, setFiles] = useState([]); const [dragging, setDragging] = useState(false); const [submitted, setSubmitted] = useState(false); const inputRef = useRef(null); const isMobile = useIsMobile(); const addFiles = (fileList: FileList) => { const newFiles: UploadFile[] = Array.from(fileList).map(f => ({ name: f.name, size: f.size, status: 'ready', })); setFiles(prev => [...prev, ...newFiles]); }; const remove = (i: number) => setFiles(prev => prev.filter((_, idx) => idx !== i)); const handleSubmit = () => { if (!files.length) return; setFiles(prev => prev.map(f => ({ ...f, status: 'uploading' }))); setTimeout(() => { setFiles(prev => prev.map(f => ({ ...f, status: 'done' }))); setTimeout(() => setSubmitted(true), 600); }, 1800); }; return (
{/* ── HERO ────────────────────────────────────────── */}
BMP 2026 – Bewerbungsportal

UNTERLAGEN
EINREICHEN

Laden Sie Ihre Bewerbungsunterlagen sicher hoch. Alle Einreichungen werden vertraulich behandelt und direkt an die Jury weitergeleitet.

{/* Stats row */}
{[ { num: '100%', label: 'Vertraulich' }, { num: 'SSL', label: 'Verschlüsselt' }, { num: '30 MB', label: 'Max. Dateigröße' }, { num: 'PDF/DOCX', label: 'Akzeptierte Formate' }, ].map((s, i) => (
{s.num}
{s.label}
))}
{/* Breadcrumb */}
Formular hochladen
{/* ── ERKLÄRUNG ───────────────────────────────────── */}

Was wird benötigt?

ANFORDERUNGEN & FRISTEN

{[ { icon: FileText, title: 'Pflichtdokumente', items: ['Kurzprofil des Unternehmens (max. 2 Seiten)', 'Begründung der Bewerbung (mind. 500 Wörter)', 'Anschreiben der Geschäftsführung', 'Letzte 2 Jahresabschlüsse (optional, falls vorhanden)'], }, { icon: Clock, title: 'Fristen & Einreichung', items: ['Bewerbungsschluss: 30. Juni 2026', 'Nachreichungen bis: 15. Juli 2026', 'Benachrichtigung: August 2026', 'Gala & Verleihung: Oktober 2026'], }, { icon: Shield, title: 'Technische Anforderungen', items: ['Formate: PDF, DOCX, XLSX', 'Max. Dateigröße: 30 MB pro Datei', 'Max. Gesamtgröße: 100 MB', 'Sprache: Deutsch'], }, ].map(({ icon: Icon, title, items }, i) => (

{title}

    {items.map((item, j) => (
  • – {item}
  • ))}
))}
{/* ── UPLOAD-BEREICH ──────────────────────────────── */}

Einreichung

DATEIEN HOCHLADEN

{submitted ? (

Einreichung erfolgreich

Ihre Unterlagen wurden übermittelt. Sie erhalten eine Bestätigung per E-Mail. Die Jury meldet sich bis August 2026.

Zur Teilnahmeseite
) : (
{/* Drop zone */}
{ e.preventDefault(); setDragging(true); }} onDragLeave={() => setDragging(false)} onDrop={e => { e.preventDefault(); setDragging(false); if (e.dataTransfer.files.length) addFiles(e.dataTransfer.files); }} onClick={() => inputRef.current?.click()} style={{ border: `2px dashed ${dragging ? GOLD : 'rgba(255,255,255,0.2)'}`, padding: '52px 32px', textAlign: 'center', cursor: 'pointer', background: dragging ? 'rgba(239,191,4,0.05)' : 'rgba(255,255,255,0.03)', transition: 'all 0.2s', marginBottom: 20, }} >

Dateien hierher ziehen

oder klicken zum Auswählen

{['PDF', 'DOCX', 'XLSX', 'PPT'].map(ext => ( {ext} ))}
{ if (e.target.files) addFiles(e.target.files); }} />
{/* File list */} {files.length > 0 && (
{files.map((f, i) => (
{f.status === 'done' ? : f.status === 'error' ? : } {f.name} {formatBytes(f.size)} {f.status === 'uploading' &&
} {f.status !== 'uploading' && f.status !== 'done' && ( )}
))}
)}
{/* Sidebar info + submit */}
Hinweis

Stellen Sie sicher, dass alle Pflichtdokumente vollständig sind, bevor Sie einreichen. Unvollständige Bewerbungen können nicht berücksichtigt werden.

Mit der Einreichung stimmen Sie der Verarbeitung Ihrer Daten gemäß unserer Datenschutzerklärung zu.

)}
{/* ── CTA ─────────────────────────────────────────── */}

Noch Fragen zur Einreichung?

Kontakt aufnehmen
{ (e.currentTarget as HTMLElement).style.background = '#FFD130'; (e.currentTarget as HTMLElement).style.boxShadow = '0 0 18px rgba(239,191,4,0.65), 0 0 40px rgba(239,191,4,0.3)'; }} onMouseLeave={e => { (e.currentTarget as HTMLElement).style.background = GOLD; (e.currentTarget as HTMLElement).style.boxShadow = 'none'; }} > Zur Teilnahmeseite
); }