diff --git a/src/App.tsx b/src/App.tsx index 5798eb1..2abfb67 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; import Navbar from './components/Navbar'; import Home from './components/Home'; import Spectacles from './components/Spectacles'; +import SpectacleDetail from './components/SpectacleDetail'; import Agenda from './components/Agenda'; import Ateliers from './components/Ateliers'; import Contact from './components/Contact'; @@ -10,12 +11,22 @@ import Footer from './components/Footer'; export default function App() { const [currentPage, setCurrentPage] = useState('home'); + const handleNavigate = (page: string) => { + setCurrentPage(page); + window.scrollTo({ top: 0, behavior: 'smooth' }); + }; + const renderPage = () => { + if (currentPage.startsWith('spectacle-')) { + const spectacleId = currentPage.replace('spectacle-', ''); + return ; + } + switch (currentPage) { case 'home': - return ; + return ; case 'spectacles': - return ; + return ; case 'agenda': return ; case 'ateliers': @@ -23,13 +34,13 @@ export default function App() { case 'contact': return ; default: - return ; + return ; } }; return (
- +
{renderPage()} diff --git a/src/components/Home.tsx b/src/components/Home.tsx index 9660fb0..0125d69 100644 --- a/src/components/Home.tsx +++ b/src/components/Home.tsx @@ -93,7 +93,7 @@ export default function Home({ onNavigate }: HomeProps) { viewport={{ once: true }} transition={{ delay: index * 0.2, duration: 0.6 }} className="group cursor-pointer" - onClick={() => onNavigate('spectacles')} + onClick={() => onNavigate(`spectacle-${spectacle.id}`)} >
void; +} + +export default function SpectacleDetail({ spectacleId, onNavigate }: SpectacleDetailProps) { + const spectacle = spectacles.find(s => s.id === spectacleId); + + if (!spectacle) { + return ( +
+

Spectacle introuvable.

+ +
+ ); + } + + const upcomingDates = agenda + .filter(event => event.spectacleId === spectacleId) + .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); + + return ( +
+ {/* Background */} +
+
+ +
+ {/* Back button */} + onNavigate('spectacles')} + className="group flex items-center gap-3 mb-10 font-sans font-bold text-night/60 hover:text-dream-purple transition-colors" + > + + Tous les spectacles + + + {/* Hero */} +
+ +
+ {spectacle.title} +
+
+ + +

{spectacle.title}

+ +
+
+ + {spectacle.age} +
+
+ + {spectacle.duration} +
+
+ +

+ {spectacle.summary} +

+ + {spectacle.dossierPro && spectacle.dossierPro !== '#' && ( + + + Dossier Pédagogique + + )} +
+
+ + {/* Gallery */} + {spectacle.gallery.length > 0 && ( + +

Galerie

+
+ {spectacle.gallery.map((img, index) => ( +
+ {`${spectacle.title} +
+ ))} +
+
+ )} + + {/* Upcoming dates */} + {upcomingDates.length > 0 && ( + +

Prochaines dates

+
+ {upcomingDates.map(event => { + const dateObj = new Date(event.date); + return ( +
+
+ + {dateObj.toLocaleString('fr-FR', { month: 'short' })} + + + {dateObj.getDate()} + +
+
+
+ + {dateObj.toLocaleString('fr-FR', { weekday: 'long', hour: '2-digit', minute: '2-digit' })} +
+
+ + {event.location} +
+
+ {event.bookingLink && ( + + Réserver + + )} +
+ ); + })} +
+
+ )} +
+
+ ); +} diff --git a/src/components/Spectacles.tsx b/src/components/Spectacles.tsx index da6cb4c..a5ead89 100644 --- a/src/components/Spectacles.tsx +++ b/src/components/Spectacles.tsx @@ -1,8 +1,12 @@ import { motion } from 'motion/react'; import { spectacles } from '../data'; -import { ExternalLink, Clock, Users, Star, Sparkles } from 'lucide-react'; +import { Clock, Users, Star, Sparkles } from 'lucide-react'; -export default function Spectacles() { +interface SpectaclesProps { + onNavigate: (page: string) => void; +} + +export default function Spectacles({ onNavigate }: SpectaclesProps) { return (
{/* Background Magic */} @@ -37,7 +41,7 @@ export default function Spectacles() { className={`flex flex-col ${index % 2 === 1 ? 'md:flex-row-reverse' : 'md:flex-row'} gap-10 md:gap-16 items-center`} > {/* Image Side - Dream Bubble Look */} -
+
onNavigate(`spectacle-${spectacle.id}`)}>
@@ -77,14 +81,11 @@ export default function Spectacles() {

- -