// frontend/src/components/Bracket/MatchCard.tsx import { Check } from 'lucide-react'; import { type MatchData } from '../../types'; import { printName, stringToColor } from '../../utils/helpers'; import WhistleIcon from "../../assets/whistle.svg?react" interface MatchCardProps { match: MatchData; onClick: (match: MatchData) => void; } export default function MatchCard({ match, onClick }: MatchCardProps) { const isFinished = match.status === "Finished"; const badgeColor = match.time ? stringToColor(match.court) : undefined; let borderClass = 'border-zinc-300 dark:border-zinc-700'; if (isFinished) borderClass = 'border-orange-500 ring-2 ring-orange-500/10'; const canInteract = match.hasTeams; const cursorClass = canInteract ? 'cursor-pointer hover:shadow-md hover:-translate-y-0.5' : 'cursor-default opacity-100'; const refName = match.ref_team?.name || match.ref_label; return (
canInteract && onClick(match)} className={`transition-colors w-64 bg-white dark:bg-zinc-900 print:bg-white! rounded-lg border ${borderClass} print:border-zinc-400! print:shadow-none! shadow-sm transition-all duration-200 print:transition-none relative z-10 flex flex-col ${cursorClass}`} >
# {match.number} {match.time && ( {match.court} )}
{isFinished ? ( ) : ( {match.time || 'TBD'} )}
{[ { n: match.p1, s: match.p1_sets, win: match.winner_team_id !== null && match.winner_team_id === match.p1_team_id, real: match.p1_is_real }, { n: match.p2, s: match.p2_sets, win: match.winner_team_id !== null && match.winner_team_id === match.p2_team_id, real: match.p2_is_real } ].map((p, i) => (
{p.n} {printName(p.n)} {p.s} {isFinished ? p.s : ''}
))}
{/* --- FLOATING REF BADGE --- */} {refName && !isFinished && (
{refName}
)}
); }