--- import type { CalendarEvent } from '../lib/atproto/events'; import { useTranslations, type Lang } from '../i18n/ui'; interface Props { event: CalendarEvent; lang?: Lang; label?: string; } const { event, lang = 'en' } = Astro.props; const t = useTranslations(lang); const tz = event.timezone || 'Europe/Amsterdam'; // Dutch date + 24h time on both language sides; shown in the event's own timezone. const start = new Date(event.startsAt); const end = event.endsAt ? new Date(event.endsAt) : undefined; // "25 Jun 2026" style, matching the ecosystem event cards (not numeric DD-MM-YYYY). const dateStr = start.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric', timeZone: tz, }); const timeOpts = { hour: '2-digit', minute: '2-digit', timeZone: tz } as const; const startTime = start.toLocaleTimeString('nl-NL', timeOpts); const endTime = end ? end.toLocaleTimeString('nl-NL', timeOpts) : undefined; const cancelled = event.status === 'cancelled'; ---
{event.thumb && }
{event.sourceHandle} {dateStr} · {startTime}{endTime ? `–${endTime}` : ''}

{event.name}

{ (event.location || event.mode === 'virtual') && (

{event.location ?? 'Online'}

) } {cancelled &&

{t('events.cancelled')}

} {event.description &&

{event.description}

} { event.upcoming && !cancelled ? (
{t('events.details')}
) : ( ) }