| import { Button } from "@/components/ui/button"; | |
| import { motion } from "framer-motion"; | |
| import { useState } from "react"; | |
| import { HighScoreBoard } from "../HighScoreBoard"; | |
| import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; | |
| import { LanguageSelector } from "./LanguageSelector"; | |
| import { useTranslation } from "@/hooks/useTranslation"; | |
| import { useContext } from "react"; | |
| import { LanguageContext } from "@/contexts/LanguageContext"; | |
| import { Heart } from "lucide-react"; | |
| interface WelcomeScreenProps { | |
| onStart: () => void; | |
| } | |
| export const WelcomeScreen = ({ onStart }: WelcomeScreenProps) => { | |
| const [showHighScores, setShowHighScores] = useState(false); | |
| const [showHowToPlay, setShowHowToPlay] = useState(false); | |
| const t = useTranslation(); | |
| const { language } = useContext(LanguageContext); | |
| return ( | |
| <> | |
| <motion.div | |
| initial={{ opacity: 0 }} | |
| animate={{ opacity: 1 }} | |
| className="max-w-2xl mx-auto text-center space-y-8" | |
| > | |
| <LanguageSelector /> | |
| <div> | |
| <h1 className="mb-4 text-4xl font-bold text-gray-900">{t.welcome.title}</h1> | |
| <p className="text-lg text-gray-600"> | |
| {t.welcome.subtitle} | |
| </p> | |
| </div> | |
| <div className="space-y-4"> | |
| <Button | |
| onClick={onStart} | |
| className="w-full bg-primary text-lg hover:bg-primary/90" | |
| > | |
| {t.welcome.startButton} β | |
| </Button> | |
| <div className="grid grid-cols-2 gap-4"> | |
| <Button | |
| onClick={() => setShowHowToPlay(true)} | |
| variant="outline" | |
| className="text-lg" | |
| > | |
| {t.welcome.howToPlay} π | |
| </Button> | |
| <Button | |
| onClick={() => setShowHighScores(true)} | |
| variant="outline" | |
| className="text-lg" | |
| > | |
| {t.welcome.leaderboard} π | |
| </Button> | |
| </div> | |
| </div> | |
| </motion.div> | |
| <motion.div | |
| initial={{ opacity: 0 }} | |
| animate={{ opacity: 1 }} | |
| transition={{ delay: 0.2 }} | |
| className="max-w-2xl mx-auto text-center mt-12 space-y-4" | |
| > | |
| <p className="text-sm text-gray-500"> | |
| {t.welcome.credits}{" "} | |
| <a | |
| href="https://blog.felixzieger.de/gaming-hackathon-paris/" | |
| target="_blank" | |
| rel="noopener noreferrer" | |
| className="text-primary hover:underline" | |
| > | |
| AI Gaming Hackathon | |
| </a>. | |
| </p> | |
| <div className="flex flex-col items-center gap-2"> | |
| <p className="text-sm text-gray-600">{t.welcome.helpWin}</p> | |
| <a | |
| href="https://huggingface.co/spaces/Mistral-AI-Game-Jam/description-improv/tree/main" | |
| target="_blank" | |
| rel="noopener noreferrer" | |
| className="inline-flex flex-col items-center gap-2 px-4 py-2 text-sm font-bold text-primary hover:text-primary/90 transition-colors border border-primary/20 rounded-md hover:border-primary/40" | |
| > | |
| <span className="inline-flex items-center gap-2"> | |
| <Heart className="w-4 h-4" /> {t.welcome.onHuggingface} | |
| </span> | |
| </a> | |
| </div> | |
| </motion.div> | |
| <Dialog open={showHighScores} onOpenChange={setShowHighScores}> | |
| <DialogContent className="max-h-[90vh] overflow-y-auto sm:max-w-[600px]"> | |
| <HighScoreBoard | |
| currentScore={0} | |
| avgWordsPerRound={0} | |
| onClose={() => setShowHighScores(false)} | |
| onPlayAgain={onStart} | |
| sessionId="" | |
| /> | |
| </DialogContent> | |
| </Dialog> | |
| <Dialog open={showHowToPlay} onOpenChange={setShowHowToPlay}> | |
| <DialogContent className="sm:max-w-[600px]"> | |
| <DialogHeader> | |
| <DialogTitle className="text-xl font-semibold text-primary">{t.welcome.howToPlay}</DialogTitle> | |
| </DialogHeader> | |
| <div className="space-y-6"> | |
| <div className="grid gap-4 text-gray-600"> | |
| <div> | |
| <h3 className="font-medium text-gray-800">{t.howToPlay.setup.title}</h3> | |
| <p>{t.howToPlay.setup.description}</p> | |
| </div> | |
| <div> | |
| <h3 className="font-medium text-gray-800">{t.howToPlay.goal.title}</h3> | |
| <p>{t.howToPlay.goal.description}</p> | |
| </div> | |
| <div> | |
| <h3 className="font-medium text-gray-800">{t.howToPlay.rules.title}</h3> | |
| <ul className="list-disc list-inside space-y-1"> | |
| {t.howToPlay.rules.items.map((rule, index) => ( | |
| <li key={index}>{rule}</li> | |
| ))} | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| </DialogContent> | |
| </Dialog> | |
| </> | |
| ); | |
| }; |