diff --git a/package-lock.json b/package-lock.json
index 3d27f6f..22a9ba6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,6 +14,7 @@
"@hookform/resolvers": "^5.2.2",
"@tanstack/react-query": "^5.90.16",
"axios": "^1.13.1",
+ "date-fns": "^4.1.0",
"i18next": "^25.6.0",
"next": "16.0.0",
"next-auth": "^4.24.13",
@@ -5368,6 +5369,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/date-fns": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
+ "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/kossnocorp"
+ }
+ },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
diff --git a/package.json b/package.json
index fe20d7e..2da4f21 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
"@hookform/resolvers": "^5.2.2",
"@tanstack/react-query": "^5.90.16",
"axios": "^1.13.1",
+ "date-fns": "^4.1.0",
"i18next": "^25.6.0",
"next": "16.0.0",
"next-auth": "^4.24.13",
diff --git a/src/app/[locale]/(site)/events/[slug]/page.tsx b/src/app/[locale]/(site)/events/[slug]/page.tsx
new file mode 100644
index 0000000..8100160
--- /dev/null
+++ b/src/app/[locale]/(site)/events/[slug]/page.tsx
@@ -0,0 +1,114 @@
+import { notFound } from 'next/navigation';
+import { Container, Heading, Text, Box, Badge, HStack, VStack, Icon, Flex, Button } from '@chakra-ui/react';
+import { MOCK_EVENTS } from '@/lib/api/mock-data';
+import { FaCalendarAlt, FaClock, FaTwitch, FaYoutube } from 'react-icons/fa';
+
+interface PageProps {
+ params: Promise<{
+ slug: string;
+ locale: string;
+ }>;
+}
+
+export default async function EventDetailsPage({ params }: PageProps) {
+ const { slug } = await params;
+ const event = MOCK_EVENTS.find((e) => e.slug === slug);
+
+ if (!event) {
+ notFound();
+ }
+
+ // Format date and time
+ const formattedDate = new Intl.DateTimeFormat('en-US', {
+ weekday: 'long',
+ month: 'long',
+ day: 'numeric',
+ year: 'numeric'
+ }).format(event.startTime);
+
+ const formattedTime = new Intl.DateTimeFormat('en-US', {
+ hour: 'numeric',
+ minute: 'numeric',
+ timeZoneName: 'short'
+ }).format(event.startTime);
+
+ return (
+
+
+
+ {/* Event Type Badge */}
+
+ {event.type}
+
+
+ {/* Title */}
+
+ {event.title}
+
+
+ {/* Date & Time Box */}
+
+
+
+
+ {formattedDate}
+
+
+
+ {formattedTime}
+
+
+
+
+ {/* Description (Placeholder) */}
+
+ Join us for the {event.title}. Expect world premieres, developer interviews, and exclusive gameplay reveals. Don't miss out on the biggest gaming news!
+
+
+ {/* Action Buttons */}
+
+ }
+ // as="a" href="..."
+ >
+
+ Watch on Twitch
+
+ }
+ // as="a" href="..."
+ >
+
+ Watch on YouTube
+
+
+
+
+
+ );
+}
diff --git a/src/app/[locale]/(site)/games/[slug]/page.tsx b/src/app/[locale]/(site)/games/[slug]/page.tsx
new file mode 100644
index 0000000..c795325
--- /dev/null
+++ b/src/app/[locale]/(site)/games/[slug]/page.tsx
@@ -0,0 +1,120 @@
+import { notFound } from 'next/navigation';
+import { Container, Heading, Text, Box, Image, Badge, HStack, VStack, Icon, Flex } from '@chakra-ui/react';
+import { MOCK_GAMES } from '@/lib/api/mock-data';
+import { FaCalendar, FaGamepad } from 'react-icons/fa';
+
+interface PageProps {
+ params: Promise<{
+ slug: string;
+ locale: string;
+ }>;
+}
+
+export default async function GameDetailsPage({ params }: PageProps) {
+ const { slug } = await params;
+ const game = MOCK_GAMES.find((g) => g.slug === slug);
+
+ if (!game) {
+ notFound();
+ }
+
+ // Format date
+ const formattedDate = new Intl.DateTimeFormat('en-US', {
+ dateStyle: 'long',
+ }).format(game.releaseDate);
+
+ return (
+
+ {/* Hero / Cover Section */}
+
+
+
+
+ {game.title}
+
+
+ {new Date() < game.releaseDate ? 'Upcoming' : 'Released'}
+
+ {game.platforms.map(p => (
+
+ {p}
+
+ ))}
+
+
+
+
+
+ {/* Details Grid */}
+
+ {/* Main Content */}
+
+ About
+
+ {/* Fallback description since mock doesn't have it yet */}
+ {game.title} is an anticipated title releasing on {formattedDate}.
+ Experience the next chapter in this gaming masterpiece.
+ Prepare to embark on a journey like no other.
+
+
+
+ {/* Sidebar Info */}
+
+
+ Game Info
+
+
+
+
+ Release Date
+
+ {formattedDate}
+
+
+
+
+
+ Platforms
+
+
+ {game.platforms.map(p => (
+ {p}
+ ))}
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/[locale]/(site)/home/page.tsx b/src/app/[locale]/(site)/home/page.tsx
index df78358..6a9867a 100644
--- a/src/app/[locale]/(site)/home/page.tsx
+++ b/src/app/[locale]/(site)/home/page.tsx
@@ -1,14 +1,28 @@
-import { getTranslations } from "next-intl/server";
-import HomeCard from "@/components/site/home/home-card";
+import { Container, VStack, Heading, Text, Box } from '@chakra-ui/react';
+import { GameCalendar } from '@/components/features/calendar/game-calendar';
+import { MOCK_EVENTS, MOCK_GAMES } from '@/lib/api/mock-data';
+import { ThemeSwitcher } from '@/components/features/theme-switcher';
+import { useTranslations } from 'next-intl';
-export async function generateMetadata() {
- const t = await getTranslations();
+export default function HomePage() {
+ // Static for now, in future useTranslations
+ // const t = useTranslations('dashboard');
- return {
- title: `${t("home")} | FCS`,
- };
-}
-
-export default function Home() {
- return ;
+ return (
+
+
+ {/* Hero Section / GOTY Banner could go here */}
+
+ Game Calendar
+ Track releases, events, and showcases in one place.
+
+
+ {/* Calendar */}
+
+
+
+ {/* Debug Switcher */}
+
+
+ );
}
diff --git a/src/app/[locale]/global.css b/src/app/[locale]/global.css
index 356c295..c7cbb5b 100644
--- a/src/app/[locale]/global.css
+++ b/src/app/[locale]/global.css
@@ -1,7 +1,41 @@
+@import "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,200..800&display=swap";
+
+:root {
+ --font-bricolage: 'Bricolage Grotesque', sans-serif;
+}
+
html {
scroll-behavior: smooth;
+ height: 100%;
}
body {
overflow-x: hidden;
+ min-height: 100vh;
+ /* Use dynamic theme variable or fallback */
+ background-color: var(--app-background, var(--chakra-colors-gray-950));
+ background-image: var(--app-background-image, none);
+ background-size: cover;
+ background-attachment: fixed;
+ background-position: center;
+ transition: background-color 0.5s ease-in-out;
+ color: var(--chakra-colors-gray-100);
+}
+
+/* Scrollbar Styling for Gamer Aesthetic */
+::-webkit-scrollbar {
+ width: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: rgba(0, 0, 0, 0.3);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--chakra-colors-primary-600);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--chakra-colors-primary-500);
}
diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx
index 85f0838..7afd225 100644
--- a/src/app/[locale]/layout.tsx
+++ b/src/app/[locale]/layout.tsx
@@ -1,4 +1,5 @@
import { Provider } from '@/components/ui/provider';
+import { DynamicThemeProvider } from '@/components/ui/dynamic-theme-provider';
import { Bricolage_Grotesque } from 'next/font/google';
import { hasLocale, NextIntlClientProvider } from 'next-intl';
import { notFound } from 'next/navigation';
@@ -33,7 +34,11 @@ export default async function RootLayout({
- {children}
+
+
+ {children}
+
+