diff --git a/src/App.tsx b/src/App.tsx
index 2fce6f7..a305aa9 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -4,6 +4,7 @@ import Navbar from './components/Navbar';
import Footer from './components/Footer';
import Home from './pages/Home';
import AllEvents from './pages/AllEvents';
+import EventDetail from './pages/EventDetail';
function ScrollToTop() {
const { pathname } = useLocation();
@@ -26,6 +27,7 @@ function App() {
} />
} />
+ } />
diff --git a/src/components/EventCard.tsx b/src/components/EventCard.tsx
index 7c80920..20bebcd 100644
--- a/src/components/EventCard.tsx
+++ b/src/components/EventCard.tsx
@@ -1,6 +1,8 @@
import { MapPin, Calendar, ArrowRight } from 'lucide-react';
+import { Link } from 'react-router-dom';
interface EventCardProps {
+ id: string;
title: string;
image: string;
date: string;
@@ -12,6 +14,7 @@ interface EventCardProps {
}
export default function EventCard({
+ id,
title,
image,
date,
@@ -79,16 +82,22 @@ export default function EventCard({
BY: {organizer}
-
+ {isAvailable ? (
+
+ BELI TIKET
+
+
+ ) : (
+
+ )}
diff --git a/src/pages/EventDetail.tsx b/src/pages/EventDetail.tsx
new file mode 100644
index 0000000..d6cdc43
--- /dev/null
+++ b/src/pages/EventDetail.tsx
@@ -0,0 +1,204 @@
+import { useState } from 'react';
+import { useParams, Link } from 'react-router-dom';
+import { ArrowLeft, MapPin, Calendar, Info, FileText, Ticket as TicketIcon } from 'lucide-react';
+
+const MOCK_EVENT_DETAIL = {
+ id: '1',
+ title: 'ADVENTURE FEST 2026 MUTIARA GADING CITY',
+ image: 'https://images.unsplash.com/photo-1540039155732-6761b54f6cce?q=80&w=1200&auto=format&fit=crop',
+ date: 'Minggu, 26 April 2026',
+ time: 'Pk. 06.00 - 12.00 WIB',
+ location: 'South Lake Park, Kabupaten Bekasi',
+ fullAddress: 'Blk. M 09 - M 10 No.15, Setia Asih, Kec. Tarumajaya, Kabupaten Bekasi, Jawa Barat 17215',
+ organizer: 'Harmoni Kreasi',
+ description: [
+ 'Tiket hanya berlaku pada hari H',
+ 'Acara dimulai pukul 06.00 WIB hingga selesai.',
+ 'Peserta wajib membawa kartu identitas (KTP/SIM/Kartu Pelajar) saat acara berlangsung.',
+ 'Pendaftaran bersifat final, tidak dapat dialihkan kepada pihak lain, tidak dapat mengubah kategori lomba.'
+ ],
+ tickets: [
+ {
+ id: 't1',
+ name: 'PRESALE INCLUDE INSURANCE',
+ benefits: 'Include: Jersey Peserta + Insurance + Finisher Medal + Best Finisher + Waterstation + Refreshment + Tiket Konser UTOPIA Harga Sudah Termasuk Pajak',
+ category: 'PELARI',
+ validDate: '24 Mei 2026',
+ price: 'IDR 155.000',
+ },
+ {
+ id: 't2',
+ name: 'PRESALE NON INSURANCE',
+ benefits: 'Include: Jersey Peserta + Finisher Medal + Best Finisher + Waterstation + Refreshment + Tiket Konser UTOPIA Harga Sudah Termasuk Pajak',
+ category: 'PELARI',
+ validDate: '24 Mei 2026',
+ price: 'IDR 135.000',
+ }
+ ]
+};
+
+export default function EventDetail() {
+ const { id } = useParams();
+ const [activeTab, setActiveTab] = useState<'info' | 'desc' | 'ticket'>('ticket');
+
+ // Dalam aplikasi nyata, Anda akan fetch data berdasarkan `id`
+ const event = MOCK_EVENT_DETAIL;
+
+ return (
+
+
+
+ {/* Back Button */}
+
+
+ KEMBALI KE EVENTS
+
+
+ {/* Hero Banner */}
+
+

+
+
+ {event.title}
+
+
+ {event.date}
+
+
+
+
+ {/* Info Highlights */}
+
+
+
+
+
+
+
Waktu Pelaksanaan
+
{event.time}
+
+
+
+
+
+
+
+
Lokasi
+
{event.location}
+
+
+
+
+ {/* Tabs System */}
+
+
+ {/* Tab Headers */}
+
+
+
+
+
+
+ {/* Tab Content */}
+
+
+ {/* INFO TAB */}
+ {activeTab === 'info' && (
+
+
Venue Detail
+
+
{event.location}
+
+ {event.fullAddress}
+
+
+
+
+ )}
+
+ {/* DESCRIPTION TAB */}
+ {activeTab === 'desc' && (
+
+
Syarat & Ketentuan
+
+ {event.description.map((desc, idx) => (
+ -
+
+ {desc}
+
+ ))}
+
+
+ )}
+
+ {/* TICKET TAB */}
+ {activeTab === 'ticket' && (
+
+ {event.tickets.map((ticket) => (
+
+
+ {ticket.name}
+
+
+ {ticket.benefits}
+
+
+
+
+ {ticket.category}
+
+
+ Valid: {ticket.validDate}
+
+
+
+
+
+ {ticket.price}
+
+
+
+
+ ))}
+
+ )}
+
+
+
+
+
+
+ );
+}