"use client"; import { GroupTable, Match, Team, ThirdPlaceRow } from "@/lib/types"; import { ThirdAssignment } from "@/lib/bracket"; import { resolveBracket, ResolvedSide, ResolvedTie } from "@/lib/resolve-bracket"; function Side({ s, prob }: { s: ResolvedSide; prob?: number | null }) { return (
{s.teamId ? ( <> {s.label} {s.code && {s.code}} ) : ( {s.label} )} {prob != null && prob > 0 && ( {Math.round(prob * 100)}% )} {s.score != null ? s.score : "–"}
); } function Tie({ tie, isFinal }: { tie: ResolvedTie; isFinal?: boolean }) { return (
#{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, later } = resolveBracket(matches, teams, tables, thirds, assignment); const pick = (nums: number[]) => nums.map((n) => later[n]).filter(Boolean); const r16 = pick([89, 90, 91, 92, 93, 94, 95, 96]); const qf = pick([97, 98, 99, 100]); const sf = pick([101, 102]); 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 Platzhalter offen %-Werte: Polymarket-Wahrscheinlichkeit (falls verfügbar)
); }