diff --git a/src/content.config.ts b/src/content.config.ts index 93fd268dd..a9b9f6e90 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -384,6 +384,21 @@ const jobs = defineCollection({ }), }); +const events = defineCollection({ + loader: glob({ pattern: "*.{md,mdx}", base: "./src/content/events" }), + schema: z.object({ + title: z.string(), + date: z.string(), + date_end: z.string().optional(), + time_start: z.string().optional(), + time_end: z.string().optional(), + location: z.string().optional(), + url: z.string().optional(), + description: z.string(), + draft: z.boolean().optional().default(false), + }), +}); + const sprints = defineCollection({ loader: glob({ pattern: "*.{md,mdx}", base: "./src/content/sprints" }), schema: z.object({ @@ -411,6 +426,7 @@ const sprints = defineCollection({ export const collections = { days, + events, pages, deadlines, week, diff --git a/src/content/events/language-summit.md b/src/content/events/language-summit.md new file mode 100644 index 000000000..d5d778265 --- /dev/null +++ b/src/content/events/language-summit.md @@ -0,0 +1,12 @@ +--- +title: Python Language Summit +date: "2026-07-14" +time_start: "09:00" +time_end: "17:00" +location: "ICE Kraków Congress Centre, room TBA" +url: /language-summit +description: + CPython and alternative implementation developers gather to share information, + discuss common problems, and solve them. Invite only. +draft: false +--- diff --git a/src/content/events/packaging-summit.md b/src/content/events/packaging-summit.md new file mode 100644 index 000000000..617985be7 --- /dev/null +++ b/src/content/events/packaging-summit.md @@ -0,0 +1,12 @@ +--- +title: Packaging Summit +date: "2026-07-13" +time_start: "09:00" +time_end: "17:00" +location: "ICE Kraków Congress Centre, room TBA" +url: /packaging-summit +description: + Maintainers of packaging tools, standards, and infrastructure discuss the + future of Python packaging. Open to all contributors. +draft: false +--- diff --git a/src/content/events/rust-summit.md b/src/content/events/rust-summit.md new file mode 100644 index 000000000..40c6d03e6 --- /dev/null +++ b/src/content/events/rust-summit.md @@ -0,0 +1,13 @@ +--- +title: Rust Summit +date: "2026-07-13" +time_start: "09:00" +time_end: "17:00" +location: "ICE Kraków Congress Centre, room TBA" +url: /rust-summit +description: + A summit for Python developers interested in Rust integrations, the PyO3 + ecosystem, and bringing Rust tooling into CPython and other Python + implementations. +draft: false +--- diff --git a/src/content/events/sprints.md b/src/content/events/sprints.md new file mode 100644 index 000000000..3ce83bb17 --- /dev/null +++ b/src/content/events/sprints.md @@ -0,0 +1,11 @@ +--- +title: Sprints Weekend +date: "2026-07-18" +date_end: "2026-07-19" +location: "Details Soon" +url: /sprints +description: + Two days of open-source contribution alongside project maintainers. Sign up + for a project or bring your own. All experience levels welcome. +draft: false +--- diff --git a/src/content/events/women-in-python-run.md b/src/content/events/women-in-python-run.md new file mode 100644 index 000000000..2cdb75274 --- /dev/null +++ b/src/content/events/women-in-python-run.md @@ -0,0 +1,12 @@ +--- +title: "Women in Python 5K @ EuroPython 2026" +date: "2026-07-16" +time_start: "Morning" +location: "TBA (approx. 5 min walk from ICE)" +url: https://docs.google.com/forms/d/e/1FAIpQLSdLczNLEkOP2itz42KyW7kD-9TSez6H6KrMluBVdOoNE3ZgSQ/formResponse +description: + A ~5 km community run along the river before the conference day begins. + Meeting point is approximately a 5-minute walk from the conference venue. Sign + up required. +draft: false +--- diff --git a/src/data/nav.ts b/src/data/nav.ts index 632252f16..22aaa42ab 100644 --- a/src/data/nav.ts +++ b/src/data/nav.ts @@ -47,6 +47,7 @@ const L = { packagingSummit: { label: "Packaging Summit", url: "/packaging-summit" }, // Events & Social + sideEvents: { label: "Side Events", url: "/schedule/events" }, sprints: { label: "Sprints Weekend", url: "/sprints" }, socialEvent: { label: "Social Event", url: "/social-event" }, beginnersDay: { label: "Beginners' Day", url: "/beginners-day" }, @@ -129,6 +130,7 @@ export const NAV_MENUS: NavMenu[] = [ label: "Talks & Schedule", items: [ L.schedule, + L.sideEvents, L.talks, L.tutorials, L.posters, @@ -257,6 +259,7 @@ export const FOOTER_COLUMNS: FooterColumn[] = [ { title: "Events", items: [ + L.sideEvents, L.sprints, L.socialEvent, L.beginnersDay, diff --git a/src/pages/schedule/events.astro b/src/pages/schedule/events.astro new file mode 100644 index 000000000..d9e2ea60c --- /dev/null +++ b/src/pages/schedule/events.astro @@ -0,0 +1,276 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "@layouts/Layout.astro"; +import Section from "@ui/Section.astro"; + +const allEvents = await getCollection("events", ({ data }) => + import.meta.env.MODE === "production" ? data.draft !== true : true +); + +// Sort by date then time_start +allEvents.sort((a, b) => { + const dateCompare = a.data.date.localeCompare(b.data.date); + if (dateCompare !== 0) return dateCompare; + const aTime = a.data.time_start ?? "00:00"; + const bTime = b.data.time_start ?? "00:00"; + return aTime.localeCompare(bTime); +}); + +// Group by date +const byDay: Map = new Map(); +for (const event of allEvents) { + const key = event.data.date; + if (!byDay.has(key)) byDay.set(key, []); + byDay.get(key)!.push(event); +} + +const formatDate = (isoDate: string) => { + const d = new Date(isoDate + "T12:00:00Z"); + return d.toLocaleDateString("en-GB", { + weekday: "long", + day: "numeric", + month: "long", + timeZone: "Europe/Warsaw", + }); +}; + +const formatTimeRange = (start?: string, end?: string, dateEnd?: string, date?: string) => { + if (dateEnd && date) { + const d1 = new Date(date + "T12:00:00Z"); + const d2 = new Date(dateEnd + "T12:00:00Z"); + const d1str = d1.toLocaleDateString("en-GB", { weekday: "short", day: "numeric", month: "short", timeZone: "Europe/Warsaw" }); + const d2str = d2.toLocaleDateString("en-GB", { weekday: "short", day: "numeric", month: "short", timeZone: "Europe/Warsaw" }); + return `${d1str} – ${d2str}`; + } + if (start && end) return `${start} – ${end}`; + if (start) return `From ${start}`; + return "All day"; +}; +--- + + +
+
+
+

Side Events

+

+ Summits, sprints, and community gatherings running alongside the main + programme. July 13–19, Kraków. +

+
+ + {Array.from(byDay.entries()).map(([date, events]) => ( +
+

{formatDate(date)}

+
+ {events.map((event) => ( +
+
+ + {formatTimeRange(event.data.time_start, event.data.time_end, event.data.date_end, event.data.date)} + + {event.data.location && ( + + + {event.data.location} + + )} +
+
+

+ {event.data.url ? ( + {event.data.title} + ) : ( + event.data.title + )} +

+

{event.data.description}

+ {event.data.url && ( + + Full details + + + )} +
+
+ ))} +
+
+ ))} +
+
+
+ +