diff --git a/src/pages/Schedule.tsx b/src/pages/Schedule.tsx new file mode 100644 index 0000000..876d487 --- /dev/null +++ b/src/pages/Schedule.tsx @@ -0,0 +1,127 @@ +import { useState } from "react"; +import { Link } from "react-router-dom"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent } from "@/components/ui/card"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Clock, MapPin, Coffee } from "lucide-react"; +import Header from "@/components/Header"; +import Footer from "@/components/Footer"; + +const tracks = ["All", "Frontend", "Backend", "Design", "DevOps"]; + +const typeBadgeColor: Record = { + Keynote: "bg-indigo-500/20 text-indigo-300 border-indigo-500/30", + Talk: "bg-cyan-500/20 text-cyan-300 border-cyan-500/30", + Workshop: "bg-emerald-500/20 text-emerald-300 border-emerald-500/30", + Panel: "bg-amber-500/20 text-amber-300 border-amber-500/30", +}; + +const schedule = { + "Day 1": [ + { time: "09:00", title: "Opening Keynote: The Future of Web", speaker: "Sarah Kim", room: "Main Hall", type: "Keynote", track: "Frontend" }, + { time: "10:00", title: "React Server Components in Production", speaker: "Alex Morgan", room: "Room A", type: "Talk", track: "Frontend" }, + { time: "11:00", title: "", speaker: "", room: "", type: "Break", track: "" }, + { time: "11:30", title: "Building Scalable APIs with Edge Functions", speaker: "Raj Joshi", room: "Workshop Lab", type: "Workshop", track: "Backend" }, + { time: "12:30", title: "", speaker: "", room: "", type: "Lunch", track: "" }, + { time: "14:00", title: "Design Systems That Scale", speaker: "Lisa Park", room: "Room B", type: "Talk", track: "Design" }, + { time: "15:00", title: "Panel: Infrastructure as Code in 2026", speaker: "Diana Nguyen + Panel", room: "Main Hall", type: "Panel", track: "DevOps" }, + { time: "16:30", title: "Signals, Reactivity & Beyond", speaker: "Tom Walsh", room: "Room A", type: "Talk", track: "Frontend" }, + ], + "Day 2": [ + { time: "09:00", title: "Keynote: AI-Native Development", speaker: "Raj Joshi", room: "Main Hall", type: "Keynote", track: "Backend" }, + { time: "10:00", title: "Zero-Downtime Deployments at Scale", speaker: "Diana Nguyen", room: "Room A", type: "Talk", track: "DevOps" }, + { time: "11:00", title: "", speaker: "", room: "", type: "Break", track: "" }, + { time: "11:30", title: "Figma to Code: Bridging the Gap", speaker: "Lisa Park", room: "Workshop Lab", type: "Workshop", track: "Design" }, + { time: "12:30", title: "", speaker: "", room: "", type: "Lunch", track: "" }, + { time: "14:00", title: "Full-Stack TypeScript Patterns", speaker: "Alex Morgan", room: "Room B", type: "Talk", track: "Frontend" }, + { time: "15:00", title: "Panel: The State of Serverless", speaker: "Tom Walsh + Panel", room: "Main Hall", type: "Panel", track: "Backend" }, + { time: "16:30", title: "Kubernetes for Frontend Developers", speaker: "Diana Nguyen", room: "Workshop Lab", type: "Workshop", track: "DevOps" }, + ], + "Day 3": [ + { time: "09:00", title: "Keynote: Designing for the AI Era", speaker: "Lisa Park", room: "Main Hall", type: "Keynote", track: "Design" }, + { time: "10:00", title: "GraphQL Federation at Scale", speaker: "Raj Joshi", room: "Room A", type: "Talk", track: "Backend" }, + { time: "11:00", title: "", speaker: "", room: "", type: "Break", track: "" }, + { time: "11:30", title: "Micro-Frontends: Lessons Learned", speaker: "Sarah Kim", room: "Room B", type: "Talk", track: "Frontend" }, + { time: "12:30", title: "", speaker: "", room: "", type: "Lunch", track: "" }, + { time: "14:00", title: "GitOps Workshop: From Zero to Production", speaker: "Diana Nguyen", room: "Workshop Lab", type: "Workshop", track: "DevOps" }, + { time: "15:30", title: "Panel: The Future of JavaScript Runtimes", speaker: "Tom Walsh + Panel", room: "Main Hall", type: "Panel", track: "Frontend" }, + { time: "17:00", title: "Closing Keynote: Building What Matters", speaker: "Sarah Kim", room: "Main Hall", type: "Keynote", track: "Backend" }, + ], +}; + +export default function SchedulePage() { + const [activeTrack, setActiveTrack] = useState("All"); + + return ( +
+
+ + {/* Hero */} +
+

Schedule

+

Three days packed with keynotes, workshops, and deep-dive sessions.

+
+ + {/* Track Filters */} +
+
+ {tracks.map((t) => ( + + ))} +
+
+ + {/* Day Tabs */} +
+
+ + + {Object.keys(schedule).map((day) => ( + {day} + ))} + + {Object.entries(schedule).map(([day, sessions]) => ( + +
+ {sessions.filter((s) => activeTrack === "All" || s.track === activeTrack || s.type === "Break" || s.type === "Lunch").map((s, i) => ( + s.type === "Break" || s.type === "Lunch" ? ( +
+ + {s.time} — {s.type === "Break" ? "Coffee Break" : "Lunch Break"} +
+ ) : ( + + +
+ + {s.time} +
+
+
{s.title}
+
+ {s.speaker} + {s.type === "Keynote" && ~200 seats} +
+
+
+ {s.room} + {s.type} +
+
+
+ ) + ))} +
+
+ ))} +
+
+
+ +
+ ); +} \ No newline at end of file