"use client"; import { GroupTable, Match, Team, ThirdPlaceRow } from "@/lib/types"; import { ThirdAssignment, orderedRound } from "@/lib/bracket"; import { resolveBracket, ResolvedSide, ResolvedTie } from "@/lib/resolve-bracket"; import Flag from "./Flag"; function Side({ s, prob, teams, }: { s: ResolvedSide; prob?: number | null; teams: Team[] }) { const team = s.teamId ? teams.find((t) => t.id === s.teamId) : undefined; // fix = ein echtes Team steht fest (nicht vorläufig). Eigene Klasse für klares Styling. const fix = s.teamId != null && !s.provisional; return (
{s.teamId ? ( <> {s.label} {s.provisional && } ) : ( {s.label} )} {prob != null && prob > 0 && ( {Math.round(prob * 100)}% )} {s.score != null ? s.score : "–"}
); } function Tie({ tie, teams, isFinal }: { tie: ResolvedTie; teams: Team[]; isFinal?: boolean }) { return (
Spiel {tie.matchNumber}
); } export default function Bracket({ matches, teams, tables, thirds, assignment, annexResolved, }: { matches: Match[]; teams: Team[]; tables: GroupTable[]; thirds: ThirdPlaceRow[]; assignment: ThirdAssignment | null; annexResolved: boolean; }) { const { r32: r32Array, later } = resolveBracket( matches, teams, tables, thirds, assignment, annexResolved, ); const r32ByNum = new Map(r32Array.map((t) => [t.matchNumber, t])); // Korrekte Baum-Reihenfolge: von der Wurzel (Finale) rekursiv die Quellen // jeder Runde ermitteln, damit die Spalten vertikal ausgerichtet sind. const sfOrder = orderedRound([104]); const qfOrder = orderedRound(sfOrder); const r16Order = orderedRound(qfOrder); const r32Order = orderedRound(r16Order); const r32 = r32Order.map((n) => r32ByNum.get(n)).filter(Boolean) as ResolvedTie[]; const r16 = r16Order.map((n) => later[n]).filter(Boolean); const qf = qfOrder.map((n) => later[n]).filter(Boolean); const sf = sfOrder.map((n) => later[n]).filter(Boolean); const fin = later[104]; const third = later[103]; return (
Annex-C-Zuordnung der Drittplatzierten: {annexResolved ? "aufgelöst — die acht Dritten sind den Gruppensiegern fest zugeteilt" : "noch offen — sobald die 8 besten Dritten feststehen, verbindet sich der Baum automatisch"}
Letzte 32
{r32.map((t) => )}
Achtelfinale
{r16.map((t) => )}
Viertelfinale
{qf.map((t) => )}
Halbfinale
{sf.map((t) => )}
Finale
{fin && } {third && (
Spiel um Platz 3
)}
Sieger / weiter Finale fix qualifiziert vorläufig (≈, nach aktueller Tabelle) Platzhalter offen %-Werte: Polymarket-Wahrscheinlichkeit (falls verfügbar)
); }