import React, { useState } from 'react' import { useParams, Link } from '@/spa/router' import { motion } from 'framer-motion' import { Calendar, MapPin, Clock, Bell, BellOff, ArrowLeft, ChevronRight, Users, Tag } from 'lucide-react' import { getEventBySlug, EventUpdate, UpdateType } from '@/spa/data/events' import { useIsMobile } from '@/spa/hooks/useIsMobile' const NAVY = '#111D55' const GOLD = '#EFBF04' const CREAM = '#EFE5E3' const INK = '#3A3A3A' // ── Timestamp formatter ────────────────────────────────────────────────────── const MONATE = ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'] function formatTs(iso: string): string { const d = new Date(iso) return `${d.getDate()}. ${MONATE[d.getMonth()]} ${d.getFullYear()}, ${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')} Uhr` } // ── Update type styling ────────────────────────────────────────────────────── const UPDATE_STYLE: Record = { ankündigung: { bg: '#EBF4FF', color: '#1D4ED8', label: 'Ankündigung' }, erinnerung: { bg: '#FFFBEB', color: '#B45309', label: 'Erinnerung' }, update: { bg: '#F3F4F6', color: '#374151', label: 'Update' }, highlight: { bg: `${NAVY}12`, color: NAVY, label: 'Highlight' }, ergebnis: { bg: '#ECFDF5', color: '#065F46', label: 'Ergebnis' }, wichtig: { bg: '#FEF2F2', color: '#991B1B', label: 'Wichtig' }, } // ── Status badge ───────────────────────────────────────────────────────────── const STATUS_LABEL: Record = { 'geplant': { label: 'In Planung', bg: `${NAVY}18`, color: NAVY }, 'anmeldung-offen': { label: 'Anmeldung offen', bg: '#ECFDF5', color: '#065F46' }, 'intern': { label: 'Intern', bg: '#FEF9C3', color: '#713F12' }, 'abgeschlossen': { label: 'Abgeschlossen', bg: '#F3F4F6', color: '#6B7280' }, } // ── Update Card ─────────────────────────────────────────────────────────────── function UpdateCard({ update, index }: { update: EventUpdate; index: number }) { const style = UPDATE_STYLE[update.type] ?? UPDATE_STYLE.update return ( {/* Timeline dot */}
{/* Card */}
{style.label} {formatTs(update.timestamp)}
{update.title}
{update.body}
) } // ── Main Component ──────────────────────────────────────────────────────────── export default function EventDetail() { const { slug } = useParams<{ slug: string }>() const event = getEventBySlug(slug ?? '') const [subscribed, setSubscribed] = useState(false) const isMobile = useIsMobile() if (!event) { return (
404
Event nicht gefunden
Zurück zur Presse-Seite
) } const statusStyle = STATUS_LABEL[event.status] ?? STATUS_LABEL['geplant'] return (
{/* ── Hero ─────────────────────────────────────────────────────────── */}
{event.title}
{/* Back link */}
(e.currentTarget.style.color = '#fff')} onMouseLeave={e => (e.currentTarget.style.color = 'rgba(255,255,255,0.7)')} > Alle Events
{/* Hero content */}
{/* Left */}
{statusStyle.label} {event.category}

{event.title}

{event.subtitle}

{/* Right – key facts */}
{[ { icon: Calendar, label: event.date }, { icon: Clock, label: event.time }, { icon: MapPin, label: `${event.venue}, ${event.location}` }, ].map(({ icon: Icon, label }, i) => (
{label}
))}
{/* Gold bottom line */}
{/* ── Main Content ─────────────────────────────────────────────────── */}
{/* Left – Description + Eckdaten */}
{/* Description */}

Über die Veranstaltung

{event.longDescription.split('\n\n').map((para, i) => (

{para}

))}
{/* Eckdaten */}

Eckdaten

{event.eckdaten.map((item, i) => (
{item.label}
{item.value}
))}
{/* CTA */}
{event.status === 'anmeldung-offen' && ( Jetzt anmelden )} Frage stellen
{/* Right – Live Updates Feed (sticky on desktop, static on mobile) */}
{/* Header */}
Live Updates {event.updates.length}
{subscribed && ( ✓ Sie erhalten Benachrichtigungen für dieses Event. )} {/* Timeline */}
{event.updates.map((update, i) => ( ))}
{/* ── Bottom CTA ───────────────────────────────────────────────────── */}

Mehr entdecken

Weitere Veranstaltungen

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