Schedule & Events
Study carefully, we only hold these events once a year.
Schedule
-Events
- {events.map(event =>Locations
-
- {locations.map(location =>
- + {schedule.locations.map(location =>
-
{location.name}
{location.description ?? "No description provided"} )}
diff --git a/app/schedule/types.ts b/app/schedule/types.ts
new file mode 100644
index 0000000..8ec0ddd
--- /dev/null
+++ b/app/schedule/types.ts
@@ -0,0 +1,26 @@
+export interface ScheduleEvent {
+ name: string,
+ id: string,
+ host?: string,
+ cancelled?: boolean,
+ description?: string,
+ slots: TimeSlot[],
+}
+
+export interface ScheduleLocation {
+ name: string,
+ id: string,
+ description?: string,
+}
+
+export interface TimeSlot {
+ id: string,
+ start: string,
+ end: string,
+ locations: string[],
+}
+
+export interface Schedule {
+ locations: ScheduleLocation[],
+ events: ScheduleEvent[],
+}
diff --git a/schedule.json b/schedule.json
new file mode 100644
index 0000000..f936f2b
--- /dev/null
+++ b/schedule.json
@@ -0,0 +1,90 @@
+{
+ "locations": [
+ {
+ "name": "House",
+ "id": "house",
+ "description": "Blue building east of the camping"
+ },
+ {
+ "name": "Common House",
+ "id": "common-house",
+ "description": "That big red building in the middle"
+ },
+ {
+ "name": "Info Desk",
+ "id": "info-desk",
+ "description": "Found at the entrance"
+ },
+ {
+ "name": "Camping Fireplace",
+ "id": "camping-fireplace",
+ "description": "Next to the big tree"
+ }
+ ],
+ "events": [
+ {
+ "name": "Arcade",
+ "id": "arcade",
+ "description": "Play retro games!",
+ "slots": [
+ {
+ "id": "arcade-1",
+ "start": "2025-07-18T10:00Z",
+ "end": "2025-07-19T01:30Z",
+ "locations": ["house"]
+ },
+ {
+ "id": "arcade-2",
+ "start": "2025-07-19T10:00Z",
+ "end": "2025-07-20T01:00Z",
+ "locations": ["house"]
+ },
+ {
+ "id": "arcade-3",
+ "start": "2025-07-20T10:00Z",
+ "end": "2025-07-20T18:00Z",
+ "locations": ["house"]
+ }
+ ]
+ },
+ {
+ "name": "Bonfire Stories",
+ "description": "Share your stories as we sit cosily around the bonfire.",
+ "id": "bonfire",
+ "slots": [
+ {
+ "id": "bonfire-1",
+ "start": "2025-07-19T20:00Z",
+ "end": "2025-07-20T01:00Z",
+ "locations": ["camping-fireplace"]
+ }
+ ]
+ },
+ {
+ "name": "Fursuit Games",
+ "description": "Playful time for the suiters.",
+ "id": "fursuit-games",
+ "slots": [
+ {
+ "id": "fursuit-games-1",
+ "start": "2025-07-19T19:00Z",
+ "end": "2025-07-19T20:00Z",
+ "locations": ["common-house"]
+ }
+ ]
+ },
+ {
+ "name": "Late Stragglers",
+ "description": "Wait a minute, why are you still here?.",
+ "id": "too-late",
+ "slots": [
+ {
+ "id": "too-late-1",
+ "start": "2025-07-22T20:00Z",
+ "end": "2025-07-23T01:00Z",
+ "locations": ["camping-fireplace"]
+ }
+ ]
+ }
+ ]
+}
diff --git a/ui/timetable.tsx b/ui/timetable.tsx
index 4f94f71..40e4844 100644
--- a/ui/timetable.tsx
+++ b/ui/timetable.tsx
@@ -1,4 +1,4 @@
-import { ScheduleEvent, TimeSlot, locations } from "@/app/schedule/events";
+import { Schedule, ScheduleEvent, ScheduleLocation, TimeSlot } from "@/app/schedule/types";
import styles from "./timetable.module.css";
const oneDayMs = 24 * 60 * 60 * 1000;
@@ -100,7 +100,9 @@ function junctionsFromEdges(edges: Iterable