"use client"; import { useState, useEffect } from "react"; import { useParams } from "next/navigation"; import Link from "next/link"; import { generateQueens, QueensPuzzle } from "@/lib/generators/queens"; import QueensBoard from "@/components/QueensBoard"; import { levelToDate, queensSizeForLevel, levelMeta, TOTAL_LEVELS, GAME_META } from "@/lib/levels"; import { getGameProgress, recordLevelSolve } from "@/lib/progress"; const DIFF_COLORS: Record = { 1: { bg: "#f0fdf4", text: "#16a34a" }, 2: { bg: "#fefce8", text: "#ca8a04" }, 3: { bg: "#fff7ed", text: "#ea580c" }, 4: { bg: "#fef2f2", text: "#dc2626" }, 5: { bg: "#faf5ff", text: "#9333ea" }, }; function fmt(s: number) { return `${String(Math.floor(s / 60)).padStart(2, "0")}:${String(s % 60).padStart(2, "0")}`; } export default function QueensLevelPage() { const { n } = useParams<{ n: string }>(); const level = Math.max(1, Math.min(TOTAL_LEVELS, parseInt(n) || 1)); const { accent } = GAME_META["queens"]; const [puzzle, setPuzzle] = useState(null); const [completed, setCompleted] = useState(false); const [bestTime, setBestTime] = useState(0); useEffect(() => { const date = levelToDate(level); const size = queensSizeForLevel(level); setPuzzle(generateQueens(date, size)); const p = getGameProgress("queens"); const record = p[level]; setCompleted(!!record); setBestTime(record?.bestTime ?? 0); }, [level]); const meta = levelMeta("queens", level); const diffColors = DIFF_COLORS[meta.difficulty]; return (
{/* Breadcrumb */}
Queens / Niveaux / Niveau {level}
{/* Header */}

Niveau {level}

{completed && ( Complété )}
{meta.difficultyLabel} {completed && bestTime > 0 && ( ⏱ {fmt(bestTime)} )}
{puzzle ? ( recordLevelSolve("queens", level, elapsed)} /> ) : (
Chargement…
)} {/* Level navigation */}
{level > 1 && ( Niveau {level - 1} )} Tous les niveaux {level < TOTAL_LEVELS && ( Niveau {level + 1} )}
); }