--- import BaseLayout from "@/layouts/BaseLayout.astro"; import eventsData from "@/data/events.json"; interface EventLink { label: string; url: string; } interface EventEntry { name: string; date: string; location: string; role: "speaker" | "attendee" | "organizer" | "mentor"; talk?: string; description?: string; blog?: string; links?: EventLink[]; } const events = (eventsData as EventEntry[]).sort( (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(), ); function fmtDate(iso: string) { const d = new Date(iso); return `${d.getDate()} ${d.toLocaleString("en-US", { month: "short" })} ${d.getFullYear()}`; } const roleLabels: Record = { speaker: "Speaker", attendee: "Attendee", organizer: "Organizer", mentor: "Mentor", }; const linkIcons: Record = { slides: ``, recording: ``, video: ``, photos: ``, github: ``, website: ``, default: ``, }; function iconForLabel(label: string): string { const key = label.toLowerCase(); for (const [k, v] of Object.entries(linkIcons)) { if (key.includes(k)) return v; } return linkIcons.default; } ---

Events

Conferences, summits, and meetups I've attended or spoken at.

{events.map((ev) => (
{roleLabels[ev.role]}
{fmtDate(ev.date)} {ev.location}

{ev.name}

{ev.talk &&

{ev.talk}

} {ev.description &&

{ev.description}

} {((ev.links && ev.links.length > 0) || ev.blog) && ( )}
))}