| 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> |
| </> |
| ); |
| }; |