NVJ Turnierplaner — Projektbeschreibung und Befunde Kurzbeschreibung - Zweck: Webapp zur Verwaltung von Volleyball-Turnieren (NVJ). Teams anlegen, Runden generieren, Ergebnisse eintragen und Scoreboard anschauen. - Tech-Stack: Vite, React 18, TypeScript, Tailwind CSS, shadcn/ui, Vitest. Architekturüberblick - Globaler State: `TournamentContext` ([src/context/TournamentContext.tsx]) verwaltet `teams`, `rounds`, `fieldCount` und stellt Mutationsfunktionen bereit (`startNewRound`, `updateMatchResult`, `completeCurrentRound`, u.a.). - Match-Generierung: `generateMatches` und `createNextRoundMatches` in [src/utils/tournamentUtils.ts] implementieren Start- und Rotationslogik (Circle-Rotation, Wartelisten, Felderaufteilung zwischen Ligen). - Typen: Zentrale Typen in [src/types/tournament.ts] (`Team`, `Match`, `Round`, `TeamScore`). - UI: Hauptansicht `TournamentView` ([src/components/TournamentView.tsx]) zeigt aktuelles Spielgeschehen; `MatchScoreInput` ([src/components/MatchScoreInput.tsx]) ermöglicht Ergebnis-Eingabe. Wichtige Erkenntnisse (kurzer Testlauf) - Dev-Server: Vite Dev-Server läuft lokal unter http://localhost:5173/ (getestet). - Tests: `npm run test` (Vitest) ausgeführt — alle Tests bestanden (1 Test, 1 File). - IDs werden via `crypto.randomUUID()` erzeugt — keine DB-Anbindung, alles im Memory State. - Punkteberechnung: Differenzbasiert mit Bonus für Gewinner (siehe `updateMatchResult` in `TournamentContext`). Empfohlene nächste Schritte - UI-Test: Kurz manuell Runde generieren, Ergebnisse eintragen, und Scoreboard prüfen. - Feature-Ideen: Persistenz (LocalStorage/IndexedDB), Export/Import von Turnierständen, Druckansicht des Spielplans. Rotationslogik beim Rundenwechsel: - Case 1: Keine wartenden Teams -> die erste Mannschaft bleibt als Anker fix, alle anderen rotieren um 1 Position. - Case 2: 1 wartendes Team -> das wartende Team rückt nach vorne, das letzte Spielteam geht auf Warteposition. - Case 3: Mehrere wartende Teams (2+) -> alle wartenden Teams rücken nach vorne, entsprechend viele bisher spielende Teams gehen auf Warteposition. Hinweis: Die erste Runde wird separat in `generateMatches()` zufällig aufgebaut; diese 3 Cases beschreiben nur die Rotation für Folgerunden. Wie man lokal startet ```bash npm install npm run dev # In neuem Terminal npm run test ``` Datum des Tests: 2026-04-29 Testergebnis (Vitest): 1 Test bestanden — Copilot (kurze Analyse)