import { ProjectListItem } from "@/components/ProjectListItem"; import { type ProjectEntry, projectList, projects } from "@/projects"; import { Link, Route, Routes, useParams } from "react-router-dom"; import { ThemeToggle } from "./components/theme-toggle"; function App() { return ( } /> } /> } /> ); } export default App; function Home() { const isDevMode = import.meta.env.VITE_PUBLIC_DEV === "1"; const sortedProjects: ProjectEntry[] = [...projectList].sort( (a, b) => parseDate(b.metadata.date).getTime() - parseDate(a.metadata.date).getTime(), ); return (

Oliver Bryan

{sortedProjects.map((project) => ( ))}
); } function ProjectRoute() { const { slug } = useParams(); if (!slug || !projects[slug]) return ; const { Component } = projects[slug]; return ; } function NotFound() { return (

Not found

Go home
); } function parseDate(dateStr: string): Date { const lower = dateStr.toLowerCase(); if (lower.includes("q1")) return new Date("2023-01-01"); if (lower.includes("q2")) return new Date("2023-04-01"); if (lower.includes("q3")) return new Date("2023-07-01"); if (lower.includes("q4")) return new Date("2023-10-01"); const months: Record = { january: 0, february: 1, march: 2, april: 3, may: 4, june: 5, july: 6, august: 7, september: 8, october: 9, november: 10, december: 11, }; for (const [monthName, monthIndex] of Object.entries(months)) { if (lower.includes(monthName)) { const yearMatch = dateStr.match(/\b(20\d{2})\b/); if (yearMatch) { return new Date(Number.parseInt(yearMatch[1], 10), monthIndex, 1); } } } const yearMatch = dateStr.match(/\b(20\d{2})\b/); if (yearMatch) { return new Date(Number.parseInt(yearMatch[1], 10), 0, 1); } return new Date(0); }