@ethlete/bracket 1.0.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethlete-bracket.mjs","sources":["../../../../libs/bracket/src/lib/bracket-errors.ts","../../../../libs/bracket/src/lib/bracket-runtime-error.ts","../../../../libs/bracket/src/lib/core/bracket-map.ts","../../../../libs/bracket/src/lib/core/layout.ts","../../../../libs/bracket/src/lib/core/tournament.ts","../../../../libs/bracket/src/lib/core/round.ts","../../../../libs/bracket/src/lib/core/match-participant.ts","../../../../libs/bracket/src/lib/core/match.ts","../../../../libs/bracket/src/lib/core/participant.ts","../../../../libs/bracket/src/lib/core/bracket.ts","../../../../libs/bracket/src/lib/drawing/path.ts","../../../../libs/bracket/src/lib/drawing/curve.ts","../../../../libs/bracket/src/lib/drawing/grid/core/bracket-element-part.ts","../../../../libs/bracket/src/lib/drawing/grid/core/bracket-element.ts","../../../../libs/bracket/src/lib/drawing/grid/core/bracket-finalizer.ts","../../../../libs/bracket/src/lib/drawing/grid/core/bracket-grid.ts","../../../../libs/bracket/src/lib/drawing/grid/core/bracket-master-column.ts","../../../../libs/bracket/src/lib/drawing/grid/core/bracket-master-column-section.ts","../../../../libs/bracket/src/lib/drawing/grid/core/bracket-sub-column.ts","../../../../libs/bracket/src/lib/drawing/grid/prebuild/bracket-continue-master-column.ts","../../../../libs/bracket/src/lib/drawing/line.ts","../../../../libs/bracket/src/lib/drawing/draw-man.ts","../../../../libs/bracket/src/lib/linked/swiss.ts","../../../../libs/bracket/src/lib/drawing/draw-man-swiss.ts","../../../../libs/bracket/src/lib/drawing/grid/double-elimination-utils.ts","../../../../libs/bracket/src/lib/drawing/grid/prebuild/bracket-sub-column-relative-to-first-round.ts","../../../../libs/bracket/src/lib/drawing/grid/prebuild/bracket-folded-third-place-section.ts","../../../../libs/bracket/src/lib/drawing/grid/prebuild/bracket-gap-master-column.ts","../../../../libs/bracket/src/lib/drawing/grid/row-span.ts","../../../../libs/bracket/src/lib/drawing/grid/double-elimination.ts","../../../../libs/bracket/src/lib/drawing/grid/double-elimination-stacked.ts","../../../../libs/bracket/src/lib/drawing/grid/single-elimination.ts","../../../../libs/bracket/src/lib/linked/match-relations.ts","../../../../libs/bracket/src/lib/linked/round-relations.ts","../../../../libs/bracket/src/lib/linked/bracket.ts","../../../../libs/bracket/src/lib/linked/resolve-bracket-slot.ts","../../../../libs/bracket/src/lib/linked/migrate-bracket-picks.ts","../../../../libs/bracket/src/lib/drawing/grid/swiss.ts","../../../../libs/bracket/src/lib/drawing/grid/types.ts","../../../../libs/bracket/src/lib/layout-registry.ts","../../../../libs/bracket/src/lib/standings/standing-pick.ts","../../../../libs/bracket/src/lib/standings/standing-pick-order.ts","../../../../libs/bracket/src/ethlete-bracket.ts"],"sourcesContent":["// codes 3400-3499 (3400 was LAYOUT_MODE_UNSUPPORTED, retired when layouts became explicit values -\n// an unsupported layout×mode combination no longer exists as a factory)\nexport const BRACKET_ERROR_CODES = {\n /** The source has no rounds/matches to render. */\n SOURCE_EMPTY: 3401,\n /** An integration received a tournament mode it does not support. */\n MODE_UNSUPPORTED: 3402,\n /** Two rounds in the source share an id. */\n DUPLICATE_ROUND: 3403,\n /** Two matches in the source share an id. */\n DUPLICATE_MATCH: 3404,\n /** A round-to-round relation could not be resolved (malformed round structure). */\n ROUND_RELATION_INVALID: 3405,\n /** A match-to-match relation could not be resolved (match counts don't line up). */\n MATCH_RELATION_INVALID: 3406,\n /** The computed layout grid is in an inconsistent state. */\n GRID_INVALID: 3407,\n /** Swiss groups could not be generated from the source. */\n SWISS_GROUPING_FAILED: 3408,\n /** A Swiss group ended up without any matches while headers are enabled. */\n SWISS_GROUP_EMPTY: 3409,\n /** A match's resolved winner id is not among its participants. */\n WINNER_NOT_FOUND: 3410,\n /** A required key was missing from an internal bracket lookup map. */\n DATA_LOOKUP_FAILED: 3411,\n /** The default cards are rendering but no `matchNormalizer` was registered to feed them. */\n MISSING_MATCH_NORMALIZER: 3412,\n /** No registered {@link BracketLayout} matches the source's tournament `mode`. */\n LAYOUT_NOT_REGISTERED: 3413,\n} as const;\n","export class BracketRuntimeError extends Error {\n constructor(code: number, message: string) {\n super(`ET${code}: ${message}`);\n this.name = 'BracketRuntimeError';\n }\n}\n","import { BracketRuntimeError } from '../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../bracket-errors';\nexport class BracketMap<TKey, TValue> extends Map<TKey, TValue> {\n constructor() {\n super();\n }\n\n getOrThrow(key: TKey): TValue {\n const value = super.get(key);\n\n if (value === undefined) {\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.DATA_LOOKUP_FAILED,\n `Value for key ${key} not found in bracket map`,\n );\n }\n\n return value;\n }\n\n first(): TValue | undefined {\n return this.values().next().value;\n }\n\n last(): TValue | undefined {\n const values = Array.from(this.values());\n return values.length > 0 ? values[values.length - 1] : undefined;\n }\n}\n","export const BRACKET_DATA_LAYOUT = {\n LEFT_TO_RIGHT: 'left-to-right',\n\n /**\n * Folded in half: each round up to the first one too small to halve is drawn twice, once on each\n * side, converging on that round and the ones after it. Halves the height and roughly doubles the\n * width, which is what a poster or a broadcast graphic wants.\n *\n * Carried by the mirrored layout factories - a layout that has no fold to make (swiss) simply has no\n * mirrored variant.\n */\n MIRRORED: 'mirrored',\n} as const;\n\nexport type BracketDataLayout = (typeof BRACKET_DATA_LAYOUT)[keyof typeof BRACKET_DATA_LAYOUT];\n","export const TOURNAMENT_MODE = {\n SINGLE_ELIMINATION: 'single-elimination',\n DOUBLE_ELIMINATION: 'double-elimination',\n SWISS_WITH_ELIMINATION: 'swiss-with-elimination',\n} as const;\n\nexport type TournamentMode = (typeof TOURNAMENT_MODE)[keyof typeof TOURNAMENT_MODE];\n\n/** Wins that advance a participant out of a swiss stage. */\nexport const SWISS_ADVANCE_WINS = 3;\n\n/** Losses that eliminate a participant from a swiss stage. */\nexport const SWISS_ELIMINATE_LOSSES = 3;\n","import { BracketDataSource } from '../integrations';\nimport { GenerateBracketDataOptions } from './bracket';\nimport { BracketMap } from './bracket-map';\nimport { BRACKET_DATA_LAYOUT } from './layout';\nimport { BracketMatchId } from './match';\nimport { TOURNAMENT_MODE } from './tournament';\nimport { BracketRuntimeError } from '../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../bracket-errors';\n\nexport type BracketRoundId = string & { _brand: 'BracketRoundId' };\nexport type BracketRoundShortId = string & { _brand: 'BracketRoundShortId' };\nexport type BracketRoundPosition = number & { _brand: 'BracketRoundPosition' };\nexport type BracketRoundMirrorType = (typeof BRACKET_ROUND_MIRROR_TYPE)[keyof typeof BRACKET_ROUND_MIRROR_TYPE];\n\nexport const BRACKET_ROUND_MIRROR_TYPE = {\n LEFT: 'left',\n RIGHT: 'right',\n} as const;\n\nexport const COMMON_BRACKET_ROUND_TYPE = {\n THIRD_PLACE: 'third-place',\n FINAL: 'final',\n} as const;\n\nexport const SINGLE_ELIMINATION_BRACKET_ROUND_TYPE = {\n SINGLE_ELIMINATION_BRACKET: 'single-elimination-bracket',\n} as const;\n\nexport const DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE = {\n UPPER_BRACKET: 'upper-bracket',\n LOWER_BRACKET: 'lower-bracket',\n REVERSE_FINAL: 'reverse-final',\n} as const;\n\nexport const SWISS_BRACKET_ROUND_TYPE = {\n SWISS: 'swiss',\n} as const;\n\nexport const GROUP_BRACKET_ROUND_TYPE = {\n GROUP: 'group',\n} as const;\n\nexport type CommonBracketRoundType = (typeof COMMON_BRACKET_ROUND_TYPE)[keyof typeof COMMON_BRACKET_ROUND_TYPE];\nexport type SingleEliminationBracketRoundType =\n | CommonBracketRoundType\n | (typeof SINGLE_ELIMINATION_BRACKET_ROUND_TYPE)[keyof typeof SINGLE_ELIMINATION_BRACKET_ROUND_TYPE];\nexport type DoubleEliminationBracketRoundType =\n | CommonBracketRoundType\n | (typeof DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE)[keyof typeof DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE];\nexport type SwissBracketRoundType = (typeof SWISS_BRACKET_ROUND_TYPE)[keyof typeof SWISS_BRACKET_ROUND_TYPE];\nexport type GroupBracketRoundType = (typeof GROUP_BRACKET_ROUND_TYPE)[keyof typeof GROUP_BRACKET_ROUND_TYPE];\n\nexport type BracketRoundType =\n SingleEliminationBracketRoundType | DoubleEliminationBracketRoundType | SwissBracketRoundType | GroupBracketRoundType;\n\nexport type BracketRoundBase<TRoundData> = {\n /**\n * How deep this round sits in its own bracket - 0 for the opening round, counted separately for the\n * upper and lower halves of a double elimination.\n *\n * **Both halves of a mirrored round share it.** That is what makes it the fold's coordinate: a\n * mirrored layout draws each depth twice, once on each side, so the depth is the only thing that says\n * which right-hand column belongs opposite which left-hand one.\n */\n logicalIndex: number;\n type: BracketRoundType;\n id: BracketRoundId;\n shortId: BracketRoundShortId;\n data: TRoundData;\n position: BracketRoundPosition;\n name: string;\n matchCount: number;\n mirrorRoundType: BracketRoundMirrorType | null;\n isFirstRound: boolean;\n isLastRound: boolean;\n isFirstOfType: boolean;\n isLastOfType: boolean;\n};\n\nexport type BracketRoundWithRelationsBase<TRoundData> = BracketRoundBase<TRoundData> & {\n matchIds: BracketMatchId[];\n};\n\nexport const createRoundsMapBase = <TRoundData, TMatchData>(\n source: BracketDataSource<TRoundData, TMatchData>,\n options: GenerateBracketDataOptions,\n) => {\n const map = new BracketMap<BracketRoundId, BracketRoundWithRelationsBase<TRoundData>>();\n\n const shouldSplitRoundsInTwo = options.layout === BRACKET_DATA_LAYOUT.MIRRORED;\n const isDoubleElimination = source.mode === TOURNAMENT_MODE.DOUBLE_ELIMINATION;\n\n let currentUpperBracketIndex = 0;\n let currentLowerBracketIndex = 0;\n\n // A fold converges once, on the first round it cannot halve, and every later round stays whole -\n // otherwise a bye (`[6, 3, 2, 1]`) reopens the fold past its middle and draws a round on both sides\n // of one that has no side. Tracked per bracket half, because the two converge separately.\n const foldClosed = { upper: false, lower: false };\n\n const splitRoundsRest: BracketRoundWithRelationsBase<TRoundData>[] = [];\n\n const terminalRoundSortPriority: Partial<Record<string, number>> = {\n [COMMON_BRACKET_ROUND_TYPE.FINAL]: 1,\n [DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL]: 2,\n [COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE]: 3,\n };\n\n const orderedRounds = [...source.rounds].sort(\n (a, b) => (terminalRoundSortPriority[a.type] ?? 0) - (terminalRoundSortPriority[b.type] ?? 0),\n );\n\n for (const [roundIndex, round] of orderedRounds.entries()) {\n const isUpperBracket = round.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET;\n const isLowerBracket = round.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET;\n const isCommonDoubleEliminationRound = !isUpperBracket && !isLowerBracket && isDoubleElimination;\n\n const matches = source.matches.filter((m) => m.roundId === round.id);\n const roundId = round.id as BracketRoundId;\n const foldSide = isLowerBracket || isCommonDoubleEliminationRound ? 'lower' : 'upper';\n const canHalveRound = matches.length >= 2 && matches.length % 2 === 0;\n const shouldSplitRound = shouldSplitRoundsInTwo && canHalveRound && !foldClosed[foldSide];\n\n if (!canHalveRound) foldClosed[foldSide] = true;\n\n const isFirstRound = roundIndex === 0;\n const isLastRound = roundIndex === orderedRounds.length - 1;\n\n const isFirstOfType = orderedRounds.findIndex((r) => r.type === round.type) === roundIndex;\n const isLastOfType =\n orderedRounds\n .slice()\n .reverse()\n .findIndex((r) => r.type === round.type) ===\n orderedRounds.length - roundIndex - 1;\n\n const depth =\n isLowerBracket || isCommonDoubleEliminationRound ? currentLowerBracketIndex : currentUpperBracketIndex;\n\n if (shouldSplitRound) {\n const firstHalfRoundId = `${roundId}--half-1` as BracketRoundId;\n const secondHalfRoundId = `${roundId}--half-2` as BracketRoundId;\n const firstHalfMatchesMaxIndex = matches.length / 2 - 1;\n\n // Both halves are the same round at the same depth, drawn on either side of the fold - so they\n // carry the same `logicalIndex`, which is what pairs a right-hand column with its left-hand twin.\n const halfBase = {\n type: round.type,\n logicalIndex: depth,\n data: round.data,\n position: (depth + 1) as BracketRoundPosition,\n name: round.name,\n matchCount: matches.length / 2,\n isFirstRound,\n isLastRound,\n isFirstOfType,\n isLastOfType,\n };\n\n const bracketRoundFirstHalf: BracketRoundWithRelationsBase<TRoundData> = {\n ...halfBase,\n id: firstHalfRoundId,\n shortId: `${roundIndex}-left` as BracketRoundShortId,\n matchIds: matches.slice(0, firstHalfMatchesMaxIndex + 1).map((m) => m.id as BracketMatchId),\n mirrorRoundType: BRACKET_ROUND_MIRROR_TYPE.LEFT,\n };\n\n const bracketRoundSecondHalf: BracketRoundWithRelationsBase<TRoundData> = {\n ...halfBase,\n id: secondHalfRoundId,\n shortId: `${roundIndex}-right` as BracketRoundShortId,\n matchIds: matches.slice(firstHalfMatchesMaxIndex + 1).map((m) => m.id as BracketMatchId),\n mirrorRoundType: BRACKET_ROUND_MIRROR_TYPE.RIGHT,\n };\n\n map.set(firstHalfRoundId, bracketRoundFirstHalf);\n\n splitRoundsRest.unshift(bracketRoundSecondHalf);\n } else {\n const bracketRound: BracketRoundWithRelationsBase<TRoundData> = {\n type: round.type,\n id: roundId,\n shortId: `${roundIndex}` as BracketRoundShortId,\n logicalIndex: depth,\n data: round.data,\n position: (depth + 1) as BracketRoundPosition,\n name: round.name,\n matchCount: matches.length,\n matchIds: matches.map((m) => m.id as BracketMatchId),\n mirrorRoundType: null,\n isFirstRound,\n isLastRound,\n isFirstOfType,\n isLastOfType,\n };\n\n map.set(roundId, bracketRound);\n }\n\n if (isLowerBracket || isCommonDoubleEliminationRound) {\n currentLowerBracketIndex++;\n } else {\n currentUpperBracketIndex++;\n }\n }\n\n // The right halves close the map, deepest first, so walking it in order walks the fold: out along the\n // left side, through the rounds too small to halve, and back along the right. `splitRoundsRest` was\n // built by unshifting, so it is already in that order - and each half keeps the depth of its twin\n // rather than being renumbered past the last round, which is what lets a builder pair the two sides.\n if (splitRoundsRest.length) {\n if (!map.last()) throw new BracketRuntimeError(BRACKET_ERROR_CODES.ROUND_RELATION_INVALID, 'Last round not found');\n\n for (const splitRound of splitRoundsRest) {\n map.set(splitRound.id, splitRound);\n }\n }\n\n return map;\n};\n","import { BracketDataSource, BracketMatchSource } from '../integrations';\nimport { BracketMap } from './bracket-map';\nimport { BracketMatchId } from './match';\nimport { MatchParticipantId, BracketParticipantBase, BracketParticipantWithRelationsBase } from './participant';\nimport {\n BracketRoundId,\n COMMON_BRACKET_ROUND_TYPE,\n DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE,\n BracketRoundWithRelationsBase,\n} from './round';\nimport { SWISS_ELIMINATE_LOSSES, TOURNAMENT_MODE } from './tournament';\nimport { BracketRuntimeError } from '../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../bracket-errors';\n\nexport type ParticipantMatchResult = 'win' | 'loss' | 'tie';\nexport type MatchParticipantSide = 'home' | 'away';\n\nexport type BracketMatchParticipantBase = BracketParticipantBase & {\n result: ParticipantMatchResult | null;\n isEliminated: boolean;\n isEliminationMatch: boolean;\n tieCount: number;\n winCount: number;\n lossCount: number;\n side: MatchParticipantSide;\n};\n\nexport type BracketMatchParticipantWithRelationsBase = BracketMatchParticipantBase &\n BracketParticipantWithRelationsBase;\n\nexport const createNewMatchParticipantBase = <TRoundData, TMatchData>(\n source: BracketDataSource<TRoundData, TMatchData>,\n participantId: MatchParticipantId | null,\n match: BracketMatchSource<TMatchData>,\n rounds: BracketMap<BracketRoundId, BracketRoundWithRelationsBase<TRoundData>>,\n matchRoundId: BracketRoundId,\n participants: BracketMap<MatchParticipantId, BracketParticipantWithRelationsBase>,\n // eslint-disable-next-line max-params -- builder maps one source participant to a bracket node; its lookups are distinct positional inputs\n) => {\n if (!participantId) return null;\n\n const participantBase = participants.getOrThrow(participantId);\n const roundBase = rounds.getOrThrow(matchRoundId as BracketRoundId);\n\n const matchIndex = participantBase.matchIds.indexOf(match.id as BracketMatchId);\n if (matchIndex === -1)\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.MATCH_RELATION_INVALID,\n `Match with id ${match.id} not found in participant with id ${participantId}`,\n );\n\n const participantSide = match.home === participantId ? 'home' : 'away';\n const isWinner = match.winner === participantSide;\n const isLooser = match.winner && match.winner !== participantSide;\n const isTie = match.status === 'completed' && !match.winner;\n\n let winsTilNow = isWinner ? 1 : 0;\n let lossesTilNow = isLooser ? 1 : 0;\n let tiesTilNow = isTie ? 1 : 0;\n\n for (let i = 0; i < matchIndex; i++) {\n const previousMatchId = participantBase.matchIds[i];\n const previousMatch = source.matches.find((m) => m.id === previousMatchId);\n const myPreviousMatchSide =\n previousMatch?.home === participantId ? 'home' : previousMatch?.away === participantId ? 'away' : null;\n\n if (!previousMatch || !myPreviousMatchSide) continue;\n\n const previousIsWinner = previousMatch.winner === myPreviousMatchSide;\n const previousIsLooser = previousMatch.winner && previousMatch.winner !== myPreviousMatchSide;\n const previousIsTie = previousMatch.status === 'completed' && !previousMatch.winner;\n\n if (previousIsWinner) {\n winsTilNow++;\n } else if (previousIsLooser) {\n lossesTilNow++;\n } else if (previousIsTie) {\n tiesTilNow++;\n }\n }\n\n const hasElimination =\n source.mode === TOURNAMENT_MODE.SINGLE_ELIMINATION ||\n source.mode === TOURNAMENT_MODE.DOUBLE_ELIMINATION ||\n source.mode === TOURNAMENT_MODE.SWISS_WITH_ELIMINATION;\n\n // Means the current match is loss and it's the last match of the participant\n let isEliminated = false;\n\n // Always true for single elimination, never for e.g. groups, depends on the round for double elimination, depends on the loss count for swiss with elimination\n let isEliminationMatch = false;\n\n if (hasElimination) {\n switch (source.mode) {\n case TOURNAMENT_MODE.SINGLE_ELIMINATION: {\n isEliminationMatch = true;\n isEliminated = isLooser ?? false;\n break;\n }\n case TOURNAMENT_MODE.DOUBLE_ELIMINATION: {\n isEliminationMatch =\n roundBase.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET ||\n roundBase.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL ||\n roundBase.type === COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE;\n\n // Final is only an elimination match if there is no reverse final or there is one and this participant came from the lower bracket\n if (roundBase.type === COMMON_BRACKET_ROUND_TYPE.FINAL) {\n const hasReverseFinal = source.rounds.some(\n (r) => r.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL,\n );\n\n if (!hasReverseFinal) break;\n\n const currentMatchIndex = participantBase.matchIds.indexOf(match.id as BracketMatchId);\n\n if (currentMatchIndex === -1)\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.MATCH_RELATION_INVALID,\n `Match with id ${match.id} not found in participant with id ${participantId}`,\n );\n\n if (currentMatchIndex === 0) break;\n\n const previousMatchIndex = currentMatchIndex - 1;\n const previousMatchId = participantBase.matchIds[previousMatchIndex];\n const previousMatch = source.matches.find((m) => m.id === previousMatchId);\n\n if (!previousMatch)\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.MATCH_RELATION_INVALID,\n `Previous match with id ${previousMatchId} not found`,\n );\n\n const previousRound = rounds.getOrThrow(previousMatch.roundId as BracketRoundId);\n\n isEliminationMatch = previousRound.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET;\n }\n\n isEliminated = (isEliminationMatch && isLooser) ?? false;\n break;\n }\n case TOURNAMENT_MODE.SWISS_WITH_ELIMINATION: {\n // `lossesTilNow` counts this match too, so the losses carried *into* it are one fewer for a\n // loser - it is those that decide whether losing here is what puts the participant out.\n const priorLosses = lossesTilNow - (isLooser ? 1 : 0);\n\n isEliminationMatch = priorLosses >= SWISS_ELIMINATE_LOSSES - 1;\n\n isEliminated = (isEliminationMatch && isLooser) ?? false;\n }\n }\n }\n\n const matchParticipantBase: BracketMatchParticipantWithRelationsBase = {\n ...participantBase,\n isEliminated,\n isEliminationMatch,\n lossCount: lossesTilNow,\n tieCount: tiesTilNow,\n winCount: winsTilNow,\n result: isWinner ? 'win' : isLooser ? 'loss' : isTie ? 'tie' : null,\n side: participantSide,\n };\n\n return matchParticipantBase;\n};\n","import { BracketDataSource, BracketSlotSource } from '../integrations';\nimport { BracketMap } from './bracket-map';\nimport {\n MatchParticipantSide,\n BracketMatchParticipantWithRelationsBase,\n createNewMatchParticipantBase,\n} from './match-participant';\nimport { MatchParticipantId, BracketParticipantWithRelationsBase } from './participant';\nimport { BracketRoundId, BracketRoundWithRelationsBase } from './round';\nimport { BracketRuntimeError } from '../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../bracket-errors';\n\nexport type BracketMatchId = string & { _brand: 'BracketMatchId' };\nexport type BracketMatchShortId = string & { _brand: 'BracketMatchShortId' };\nexport type BracketMatchPosition = number & { _brand: 'BracketMatchPosition' };\n\nexport type BracketMatchStatus = 'completed' | 'pending';\n\nexport type BracketMatchBase<TMatchData> = {\n data: TMatchData;\n indexInRound: number;\n id: BracketMatchId;\n shortId: BracketMatchShortId;\n position: BracketMatchPosition;\n winnerSide: MatchParticipantSide | null;\n status: BracketMatchStatus;\n homeSource: BracketSlotSource | null;\n awaySource: BracketSlotSource | null;\n};\n\nexport type BracketMatchWithRelationsBase<TMatchData> = BracketMatchBase<TMatchData> & {\n roundId: BracketRoundId;\n home: BracketMatchParticipantWithRelationsBase | null;\n away: BracketMatchParticipantWithRelationsBase | null;\n winner: BracketMatchParticipantWithRelationsBase | null;\n};\n\nexport const createMatchesMapBase = <TRoundData, TMatchData>(\n source: BracketDataSource<TRoundData, TMatchData>,\n rounds: BracketMap<BracketRoundId, BracketRoundWithRelationsBase<TRoundData>>,\n participants: BracketMap<MatchParticipantId, BracketParticipantWithRelationsBase>,\n // eslint-disable-next-line max-params -- builder threads the source plus its round and participant lookup maps\n) => {\n const map: BracketMap<BracketMatchId, BracketMatchWithRelationsBase<TMatchData>> = new BracketMap();\n\n for (const match of source.matches) {\n const genericRound = rounds.get(match.roundId as BracketRoundId);\n const splitRound = rounds.get(`${match.roundId}--half-1` as BracketRoundId);\n const splitRound2 = rounds.get(`${match.roundId}--half-2` as BracketRoundId);\n\n const genericRoundMatchIndex = genericRound?.matchIds.indexOf(match.id as BracketMatchId) ?? -1;\n const splitRoundMatchIndex = splitRound?.matchIds.indexOf(match.id as BracketMatchId) ?? -1;\n const splitRound2MatchIndex = splitRound2?.matchIds.indexOf(match.id as BracketMatchId) ?? -1;\n\n const roundToUse =\n genericRoundMatchIndex !== -1\n ? genericRound\n : splitRoundMatchIndex !== -1\n ? splitRound\n : splitRound2MatchIndex !== -1\n ? splitRound2\n : null;\n\n if (!roundToUse)\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.MATCH_RELATION_INVALID,\n `Round for match with id ${match.id} not found`,\n );\n\n const indexInRound =\n genericRoundMatchIndex !== -1\n ? genericRoundMatchIndex\n : splitRoundMatchIndex !== -1\n ? splitRoundMatchIndex\n : splitRound2MatchIndex !== -1\n ? splitRound2MatchIndex\n : -1;\n\n if (indexInRound === -1)\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.MATCH_RELATION_INVALID,\n `Match with id ${match.id} not found in round with id ${roundToUse.id}`,\n );\n\n const home = createNewMatchParticipantBase(\n source,\n match.home as MatchParticipantId | null,\n match,\n rounds,\n roundToUse.id,\n participants,\n );\n const away = createNewMatchParticipantBase(\n source,\n match.away as MatchParticipantId | null,\n match,\n rounds,\n roundToUse.id,\n participants,\n );\n const winner = match.winner === 'home' ? home : match.winner === 'away' ? away : null;\n\n const matchBase: BracketMatchWithRelationsBase<TMatchData> = {\n home,\n away,\n data: match.data,\n shortId: `${roundToUse.shortId}-${indexInRound}` as BracketMatchShortId,\n id: match.id as BracketMatchId,\n indexInRound,\n position: (indexInRound + 1) as BracketMatchPosition,\n roundId: roundToUse?.id,\n status: match.status,\n homeSource: match.homeSource ?? null,\n awaySource: match.awaySource ?? null,\n winner,\n winnerSide: match.winner,\n };\n\n map.set(matchBase.id, matchBase);\n }\n\n return map;\n};\n","import { BracketDataSource } from '../integrations';\nimport { BracketMap } from './bracket-map';\nimport { BracketMatchId } from './match';\n\nexport type MatchParticipantId = string & { _brand: 'MatchParticipantId' };\nexport type MatchParticipantShortId = string & { _brand: 'MatchParticipantShortId' };\n\nexport type BracketParticipantBase = {\n id: MatchParticipantId;\n shortId: MatchParticipantShortId;\n};\n\nexport type BracketParticipantWithRelationsBase = BracketParticipantBase & {\n matchIds: BracketMatchId[];\n};\n\nexport const createParticipantsMapBase = <TRoundData, TMatchData>(\n source: BracketDataSource<TRoundData, TMatchData>,\n) => {\n const map: BracketMap<MatchParticipantId, BracketParticipantWithRelationsBase> = new BracketMap();\n\n const participantIds = source.matches\n .map((m) => [m.home, m.away])\n .flat()\n .filter((p) => !!p) as MatchParticipantId[];\n\n for (const [index, participantId] of participantIds.entries()) {\n const participantBase: BracketParticipantWithRelationsBase = {\n id: participantId as MatchParticipantId,\n shortId: `p${index}` as MatchParticipantShortId,\n matchIds: source.matches\n .filter((m) => m.home === participantId || m.away === participantId)\n .map((m) => m.id as BracketMatchId),\n };\n\n map.set(participantId, participantBase);\n }\n\n return map;\n};\n","import { BracketDataSource, BracketMatchSource } from '../integrations';\nimport { BracketMap } from './bracket-map';\nimport { BracketDataLayout } from './layout';\nimport { BracketMatchId, BracketMatchWithRelationsBase, createMatchesMapBase } from './match';\nimport { BracketParticipantWithRelationsBase, createParticipantsMapBase, MatchParticipantId } from './participant';\nimport { BracketRoundId, BracketRoundWithRelationsBase, createRoundsMapBase } from './round';\nimport { TournamentMode } from './tournament';\n\nexport type BracketBase<TRoundData, TMatchData> = {\n rounds: BracketMap<BracketRoundId, BracketRoundWithRelationsBase<TRoundData>>;\n matches: BracketMap<BracketMatchId, BracketMatchWithRelationsBase<TMatchData>>;\n participants: BracketMap<MatchParticipantId, BracketParticipantWithRelationsBase>;\n mode: TournamentMode;\n};\n\nexport type GenerateBracketDataOptions = {\n layout: BracketDataLayout;\n};\n\nexport type CreateBracketOptions<TMatchData> = GenerateBracketDataOptions & {\n /** The matches feeding this one, upper arm first. Slot provenance is used when omitted. */\n previousMatchIds?: (match: BracketMatchSource<TMatchData>) => string[];\n};\n\nconst TERMINAL_ROUND_SORT_PRIORITY: Partial<Record<string, number>> = {\n final: 1,\n 'reverse-final': 2,\n 'third-place': 3,\n};\n\nconst sortSourceMatchesByRoundOrder = <TRoundData, TMatchData>(\n source: BracketDataSource<TRoundData, TMatchData>,\n): BracketDataSource<TRoundData, TMatchData> => {\n const orderedRoundIds = [...source.rounds]\n .sort((a, b) => (TERMINAL_ROUND_SORT_PRIORITY[a.type] ?? 0) - (TERMINAL_ROUND_SORT_PRIORITY[b.type] ?? 0))\n .map((r) => r.id);\n\n const roundIndexMap = new Map(orderedRoundIds.map((id, i) => [id, i]));\n\n const sortedMatches = [...source.matches].sort(\n (a, b) => (roundIndexMap.get(a.roundId) ?? 0) - (roundIndexMap.get(b.roundId) ?? 0),\n );\n\n return { ...source, matches: sortedMatches };\n};\n\nexport const createBracketBase = <TRoundData, TMatchData>(\n source: BracketDataSource<TRoundData, TMatchData>,\n options: GenerateBracketDataOptions,\n) => {\n const normalizedSource = sortSourceMatchesByRoundOrder(source);\n\n const participants = createParticipantsMapBase(normalizedSource);\n const rounds = createRoundsMapBase(normalizedSource, options);\n const matches = createMatchesMapBase(normalizedSource, rounds, participants);\n\n const bracketData: BracketBase<TRoundData, TMatchData> = {\n matches,\n rounds,\n participants,\n mode: source.mode,\n };\n\n return bracketData;\n};\n","import { BracketEdge } from './shapes';\n\nexport type PathOptions = {\n /** Unique within one drawing - see {@link BracketEdge.id}. */\n id: string;\n width: number;\n dashArray: number;\n dashOffset: number;\n className: string;\n stroke?: string;\n};\n\nexport const path = (d: string, options: PathOptions): BracketEdge => {\n const commands = d.replace(/\\s+/g, ' ').trim();\n\n return {\n id: options.id,\n d: commands,\n cssPath: `path(\"${commands}\")`,\n cssClass: options.className,\n strokeWidth: options.width,\n dashArray: options.dashArray,\n dashOffset: options.dashOffset,\n stroke: options.stroke ?? 'currentColor',\n };\n};\n","import { BracketPosition } from './math';\nimport { path, PathOptions } from './path';\n\nexport type CurveOptions = {\n lineStartingCurveAmount: number;\n lineEndingCurveAmount: number;\n path: PathOptions;\n inverted?: boolean;\n};\n\nexport const curvePath = (\n from: BracketPosition,\n to: BracketPosition,\n direction: 'up' | 'down',\n options: CurveOptions,\n // eslint-disable-next-line max-params -- geometry helper: (from, to, direction, options) reads naturally positional\n) => {\n const inverted = options.inverted ?? false;\n\n // Inline/block coordinates depending on direction and inversion\n const fromInline = inverted ? from.inline.start : from.inline.end;\n const toInline = inverted ? to.inline.end : to.inline.start;\n const fromBlock = from.block.center;\n const toBlock = to.block.center;\n\n // Both bends have to fit inside the block distance between the two cards, or the line turns past its\n // target and comes back. Scaling them down instead - to nothing, for two cards on the same row - is\n // also what keeps the six commands below identical for every connector: a CSS `d` transition\n // interpolates only between two paths of the same shape.\n const requestedCurve = options.lineStartingCurveAmount + options.lineEndingCurveAmount;\n const blockDistance = Math.abs(toBlock - fromBlock);\n const curveScale = requestedCurve > blockDistance ? blockDistance / requestedCurve : 1;\n\n const startCurve = options.lineStartingCurveAmount * curveScale;\n const endCurve = options.lineEndingCurveAmount * curveScale;\n const totalInline = Math.abs(toInline - fromInline);\n const straightLength = (totalInline - startCurve - endCurve) / 2;\n\n // Calculate key points for the path\n const straightEnd = inverted ? fromInline - straightLength : fromInline + straightLength;\n const straightStart = inverted ? toInline + straightLength : toInline - straightLength;\n\n // First curve (from start)\n const firstCurveEndX = inverted ? straightEnd - startCurve : straightEnd + startCurve;\n const firstCurveEndY = direction === 'down' ? fromBlock + startCurve : fromBlock - startCurve;\n\n // Second curve (to end)\n const secondCurveStartY = direction === 'down' ? toBlock - endCurve : toBlock + endCurve;\n const secondCurveEndX = straightStart;\n const secondCurveEndY = toBlock;\n const secondCurveBezierX = inverted ? straightStart + endCurve : straightStart - endCurve;\n\n // SVG path string\n const d = [\n `M ${fromInline} ${fromBlock}`,\n `H ${straightEnd}`,\n `Q ${firstCurveEndX} ${fromBlock}, ${firstCurveEndX} ${firstCurveEndY}`,\n `V ${secondCurveStartY}`,\n `Q ${secondCurveBezierX} ${toBlock}, ${secondCurveEndX} ${secondCurveEndY}`,\n `H ${toInline}`,\n ].join(' ');\n\n return path(d, options.path);\n};\n","import { Dimensions } from './types';\n\nexport type CreateBracketElementPartConfig = {\n elementPartHeight: number;\n};\n\n/**\n * A row is a part of an element.\n */\nexport type BracketElementPart = {\n dimensions: Dimensions;\n};\n\nexport const createBracketElementPart = (config: CreateBracketElementPartConfig) => {\n const { elementPartHeight } = config;\n\n const newElementPart: BracketElementPart = {\n dimensions: {\n width: 0,\n height: elementPartHeight,\n top: 0,\n left: 0,\n },\n };\n\n return {\n elementPart: newElementPart,\n };\n};\n","import { BracketRoundSwissGroup, BracketMatch, BracketRound } from '../../../linked';\nimport { BracketElementPart, createBracketElementPart } from './bracket-element-part';\nimport { BracketContinueComponent, BracketMatchComponent, BracketRoundHeaderComponent, Dimensions } from './types';\nimport { BracketRuntimeError } from '../../../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../../../bracket-errors';\n\n/**\n * An element is a slice of a section.\n * It can be a match, a header, a gap, etc.\n */\nexport type BracketElementBase = {\n area: string;\n\n /** The dimensions of the actual element */\n dimensions: Dimensions;\n\n /** The dimensions of the container that holds the element */\n containerDimensions: Dimensions;\n\n parts: ReadonlyArray<BracketElementPart>;\n\n span?: BracketElementSpanCoordinates;\n\n isHidden?: boolean;\n};\n\nexport type HeaderBracketElement<TRoundData, TMatchData> = BracketElementBase &\n HeaderBracketElementDetails<TRoundData, TMatchData>;\n\nexport type MatchBracketElement<TRoundData, TMatchData> = BracketElementBase &\n MatchBracketElementDetails<TRoundData, TMatchData>;\n\nexport type GapBracketElement = BracketElementBase & GapBracketElementDetails;\n\nexport type ContinueBracketElement<TRoundData, TMatchData> = BracketElementBase &\n ContinueBracketElementDetails<TRoundData, TMatchData>;\n\nexport type BracketElement<TRoundData, TMatchData> =\n | HeaderBracketElement<TRoundData, TMatchData>\n | MatchBracketElement<TRoundData, TMatchData>\n | GapBracketElement\n | ContinueBracketElement<TRoundData, TMatchData>;\n\nexport type BracketElementSpanCoordinates = {\n masterColumnStart: number;\n masterColumnEnd: number;\n sectionStart: number;\n sectionEnd: number;\n subColumnStart: number;\n subColumnEnd: number;\n};\n\nexport type BracketElementToCreateBase = {\n area: string;\n partHeights: number[];\n elementHeight: number;\n};\n\nexport type HeaderBracketElementDetails<TRoundData, TMatchData> = {\n type: 'header';\n component: BracketRoundHeaderComponent<TRoundData, TMatchData>;\n round: BracketRound<TRoundData, TMatchData>;\n roundSwissGroup: BracketRoundSwissGroup<TRoundData, TMatchData> | null;\n};\n\nexport type HeaderBracketElementToCreate<TRoundData, TMatchData> = BracketElementToCreateBase &\n HeaderBracketElementDetails<TRoundData, TMatchData>;\n\ntype MatchBracketElementDetails<TRoundData, TMatchData> = {\n type: 'match';\n component: BracketMatchComponent<TRoundData, TMatchData>;\n match: BracketMatch<TRoundData, TMatchData>;\n round: BracketRound<TRoundData, TMatchData>;\n roundSwissGroup: BracketRoundSwissGroup<TRoundData, TMatchData> | null;\n};\n\nexport type MatchBracketElementToCreate<TRoundData, TMatchData> = BracketElementToCreateBase &\n MatchBracketElementDetails<TRoundData, TMatchData>;\n\nexport type GapBracketElementDetails = {\n type: 'matchGap' | 'roundHeaderGap' | 'roundGap' | 'colGap';\n};\n\nexport type GapBracketElementToCreate = BracketElementToCreateBase & GapBracketElementDetails;\n\nexport type ContinueBracketElementDetails<TRoundData, TMatchData> = {\n type: 'continue';\n component: BracketContinueComponent<TRoundData, TMatchData>;\n matches: BracketMatch<TRoundData, TMatchData>[];\n};\n\nexport type ContinueBracketElementToCreate<TRoundData, TMatchData> = BracketElementToCreateBase &\n ContinueBracketElementDetails<TRoundData, TMatchData>;\n\nexport type BracketElementToCreate<TRoundData, TMatchData> =\n | HeaderBracketElementToCreate<TRoundData, TMatchData>\n | MatchBracketElementToCreate<TRoundData, TMatchData>\n | GapBracketElementToCreate\n | ContinueBracketElementToCreate<TRoundData, TMatchData>;\n\nexport type BracketElementType =\n | HeaderBracketElementToCreate<unknown, unknown>['type']\n | MatchBracketElementToCreate<unknown, unknown>['type']\n | GapBracketElementToCreate['type']\n | ContinueBracketElementToCreate<unknown, unknown>['type'];\n\nexport type MutableBracketElement<TRoundData, TMatchData> = {\n element: BracketElement<TRoundData, TMatchData>;\n};\n\nexport const createBracketElement = <TRoundData, TMatchData>(\n config: BracketElementToCreate<TRoundData, TMatchData>,\n): MutableBracketElement<TRoundData, TMatchData> => {\n const { type, area, elementHeight, partHeights } = config;\n\n const parts: BracketElementPart[] = [];\n\n const newElementBase: BracketElementBase = {\n dimensions: {\n width: 0,\n height: elementHeight,\n top: 0,\n left: 0,\n },\n containerDimensions: {\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n },\n parts,\n area,\n };\n\n const newElement: BracketElement<TRoundData, TMatchData> = (() => {\n switch (type) {\n case 'header':\n return {\n ...newElementBase,\n type,\n component: config.component,\n round: config.round,\n roundSwissGroup: config.roundSwissGroup,\n } satisfies HeaderBracketElement<TRoundData, TMatchData>;\n case 'match':\n return {\n ...newElementBase,\n type,\n component: config.component,\n match: config.match,\n round: config.round,\n roundSwissGroup: config.roundSwissGroup,\n } satisfies MatchBracketElement<TRoundData, TMatchData>;\n case 'matchGap':\n case 'roundHeaderGap':\n case 'roundGap':\n case 'colGap':\n return {\n ...newElementBase,\n type,\n } satisfies GapBracketElement;\n case 'continue':\n return {\n ...newElementBase,\n type,\n component: config.component,\n matches: config.matches,\n } satisfies ContinueBracketElement<TRoundData, TMatchData>;\n default:\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.GRID_INVALID,\n `Unknown element type: ${type as unknown as string}`,\n );\n }\n })();\n\n const pushPart = (...newParts: BracketElementPart[]) => {\n parts.push(...newParts);\n };\n\n for (const partHeight of partHeights) {\n const { elementPart } = createBracketElementPart({\n elementPartHeight: partHeight,\n });\n pushPart(elementPart);\n }\n\n return {\n element: newElement,\n };\n};\n","import { BracketMap } from '../../../core';\nimport { BracketRoundSwissGroup, BracketMatch, BracketRound } from '../../../linked';\nimport { MutableBracketGrid } from './bracket-grid';\nimport { BracketContinueComponent, BracketMatchComponent, BracketRoundHeaderComponent, Dimensions } from './types';\n\nexport type FinalizedBracketColumn<TRoundData = unknown, TMatchData = unknown> = {\n dimensions: Dimensions;\n elements: FinalizedBracketElement<TRoundData, TMatchData>[];\n};\n\nexport type FinalizedHeaderBracketElement<TRoundData, TMatchData> = {\n type: 'header';\n dimensions: Dimensions;\n component: BracketRoundHeaderComponent<TRoundData, TMatchData>;\n round: BracketRound<TRoundData, TMatchData>;\n roundSwissGroup: BracketRoundSwissGroup<TRoundData, TMatchData> | null;\n};\n\nexport type FinalizedMatchBracketElement<TRoundData, TMatchData> = {\n type: 'match';\n dimensions: Dimensions;\n component: BracketMatchComponent<TRoundData, TMatchData>;\n match: BracketMatch<TRoundData, TMatchData>;\n round: BracketRound<TRoundData, TMatchData>;\n roundSwissGroup: BracketRoundSwissGroup<TRoundData, TMatchData> | null;\n classes: string;\n};\n\nexport type FinalizedContinueBracketElement<TRoundData, TMatchData> = {\n type: 'continue';\n dimensions: Dimensions;\n component: BracketContinueComponent<TRoundData, TMatchData>;\n matches: BracketMatch<TRoundData, TMatchData>[];\n};\n\nexport type FinalizedBracketElement<TRoundData = unknown, TMatchData = unknown> =\n | FinalizedHeaderBracketElement<TRoundData, TMatchData>\n | FinalizedMatchBracketElement<TRoundData, TMatchData>\n | FinalizedContinueBracketElement<TRoundData, TMatchData>;\n\nexport type FinalizedBracketMatchElementMap<TRoundData, TMatchData> = BracketMap<\n string,\n FinalizedMatchBracketElement<TRoundData, TMatchData>\n>;\n\nexport const finalizeBracketGrid = <TRoundData, TMatchData>(grid: MutableBracketGrid<TRoundData, TMatchData>) => {\n const finalizedColumns: FinalizedBracketColumn<TRoundData, TMatchData>[] = [];\n const finalizedElementMap: FinalizedBracketMatchElementMap<TRoundData, TMatchData> = new BracketMap();\n\n const ignoredSections: { masterColumnIndex: number; sectionIndex: number }[] = [];\n\n for (const [masterColumnIndex, masterColumn] of grid.grid.masterColumns.entries()) {\n for (const [sectionIndex, section] of masterColumn.sections.entries()) {\n if (ignoredSections.some((s) => s.masterColumnIndex === masterColumnIndex && s.sectionIndex === sectionIndex)) {\n continue;\n }\n\n const elements: FinalizedBracketElement<TRoundData, TMatchData>[] = [];\n const firstSubColumn = section.subColumns[0];\n const lastSubColumn = section.subColumns[section.subColumns.length - 1];\n\n if (!firstSubColumn || !lastSubColumn) continue;\n\n let sectionWidth = section.dimensions.width;\n\n for (const element of firstSubColumn.elements) {\n if (element.type === 'header') {\n elements.push({\n type: 'header',\n dimensions: element.dimensions,\n component: element.component,\n round: element.round,\n roundSwissGroup: element.roundSwissGroup,\n });\n } else if (element.type === 'match') {\n const matchEl: FinalizedMatchBracketElement<TRoundData, TMatchData> = {\n type: 'match',\n dimensions: element.dimensions,\n component: element.component,\n match: element.match,\n round: element.round,\n classes: [element.match.home?.shortId, element.match.away?.shortId].filter((v) => !!v).join(' '),\n roundSwissGroup: element.roundSwissGroup,\n };\n\n elements.push(matchEl);\n finalizedElementMap.set(element.match.id, matchEl);\n } else if (element.type === 'continue') {\n elements.push({\n type: 'continue',\n dimensions: element.dimensions,\n component: element.component,\n matches: element.matches,\n });\n }\n }\n\n if (!lastSubColumn.span.isEnd) {\n for (let index = masterColumnIndex + 1; index < grid.grid.masterColumns.length; index++) {\n const nextMaster = grid.grid.masterColumns[index];\n const nextSection = nextMaster?.sections[sectionIndex];\n\n if (!nextSection) break;\n\n sectionWidth += nextSection.dimensions.width;\n ignoredSections.push({ masterColumnIndex: index, sectionIndex });\n\n if (nextSection.subColumns.some((sc) => sc.span.isEnd)) {\n break;\n }\n }\n }\n\n if (!elements.length) continue;\n\n finalizedColumns.push({\n dimensions: {\n ...section.dimensions,\n width: sectionWidth,\n },\n elements,\n });\n }\n }\n\n return {\n columns: finalizedColumns,\n elementMap: finalizedElementMap,\n };\n};\n","import { DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE } from '../../../core';\nimport { BracketElementSpanCoordinates } from './bracket-element';\nimport { BracketMasterColumn } from './bracket-master-column';\nimport { Dimensions } from './types';\n\nexport type BracketGrid<TRoundData, TMatchData> = {\n masterColumns: ReadonlyArray<BracketMasterColumn<TRoundData, TMatchData>>;\n dimensions: Dimensions;\n};\n\nexport type MutableBracketGrid<TRoundData, TMatchData> = {\n grid: BracketGrid<TRoundData, TMatchData>;\n pushMasterColumn: (...masterColumns: BracketMasterColumn<TRoundData, TMatchData>[]) => void;\n calculateDimensions: () => void;\n setupElementSpans: () => void;\n};\n\nexport const createBracketGrid = <TRoundData, TMatchData>(config: {\n spanElementWidth: number;\n}): MutableBracketGrid<TRoundData, TMatchData> => {\n const masterColumns: BracketMasterColumn<TRoundData, TMatchData>[] = [];\n const spannedWidthCache = new Map<string, number>();\n const spanStartLeftCache = new Map<string, number>();\n\n const newGrid: BracketGrid<TRoundData, TMatchData> = {\n dimensions: { width: 0, height: 0, top: 0, left: 0 },\n masterColumns,\n };\n\n const pushMasterColumn = (...newMasterColumns: BracketMasterColumn<TRoundData, TMatchData>[]) => {\n masterColumns.push(...newMasterColumns);\n };\n\n const calculateDimensions = () => {\n let currentMasterColumnLeft = 0;\n let maxGridHeight = 0;\n const masterCols = newGrid.masterColumns;\n\n for (const masterColumn of masterCols) {\n const { padding } = masterColumn;\n\n masterColumn.dimensions.left = currentMasterColumnLeft;\n masterColumn.dimensions.top = 0;\n masterColumn.dimensions.width += padding.left + padding.right;\n\n const sections = masterColumn.sections;\n let runningTop = 0;\n\n const firstElement = sections[0]?.subColumns[0]?.elements[0];\n const firstSectionIsHeader = firstElement?.type === 'header';\n\n for (const [secIdx, section] of sections.entries()) {\n const sectionPadding = section.padding ?? padding;\n\n let sectionPaddingTop: number;\n if (secIdx === 0) {\n sectionPaddingTop = firstSectionIsHeader ? 0 : sectionPadding.top;\n } else {\n sectionPaddingTop = sectionPadding.top;\n }\n\n section.dimensions.width = masterColumn.dimensions.width;\n section.dimensions.left = masterColumn.dimensions.left;\n section.dimensions.top = runningTop;\n\n runningTop += sectionPaddingTop;\n\n const contentWidth = masterColumn.dimensions.width - sectionPadding.left - sectionPadding.right;\n const subColumns = section.subColumns;\n const totalSubColumns = subColumns.length;\n const subColumnWidth = contentWidth / totalSubColumns;\n let currentSubColumnLeft = masterColumn.dimensions.left + sectionPadding.left;\n let maxSectionHeight = 0;\n\n for (const subColumn of subColumns) {\n subColumn.dimensions.width = subColumnWidth;\n subColumn.dimensions.left = currentSubColumnLeft;\n subColumn.dimensions.top = section.dimensions.top + sectionPaddingTop;\n\n let totalSubColumnHeight = 0;\n const elements = subColumn.elements;\n\n for (const element of elements) {\n let totalElementHeight = 0;\n const parts = element.parts;\n\n for (const part of parts) {\n part.dimensions.width = subColumnWidth;\n part.dimensions.left = currentSubColumnLeft;\n part.dimensions.top = subColumn.dimensions.top + totalSubColumnHeight + totalElementHeight;\n totalElementHeight += part.dimensions.height;\n }\n\n element.containerDimensions.height = totalElementHeight;\n element.containerDimensions.width = subColumnWidth;\n element.containerDimensions.left = currentSubColumnLeft;\n element.containerDimensions.top = subColumn.dimensions.top + totalSubColumnHeight;\n\n element.dimensions.width = subColumnWidth;\n element.dimensions.left = currentSubColumnLeft;\n element.dimensions.top =\n element.containerDimensions.top + (totalElementHeight - element.dimensions.height) * 0.5;\n\n totalSubColumnHeight += totalElementHeight;\n }\n\n subColumn.dimensions.height = totalSubColumnHeight;\n if (totalSubColumnHeight > maxSectionHeight) maxSectionHeight = totalSubColumnHeight;\n currentSubColumnLeft += subColumnWidth;\n }\n\n // Never negative: a section may start above where it would stack (a folded third place asks for\n // that with a negative padding), but its own box still has to be a box.\n section.dimensions.height = Math.max(0, sectionPaddingTop + maxSectionHeight + sectionPadding.bottom);\n\n runningTop += maxSectionHeight + sectionPadding.bottom;\n }\n\n masterColumn.dimensions.height = runningTop;\n if (masterColumn.dimensions.height > maxGridHeight) maxGridHeight = masterColumn.dimensions.height;\n currentMasterColumnLeft += masterColumn.dimensions.width;\n }\n\n newGrid.dimensions.width = currentMasterColumnLeft;\n newGrid.dimensions.height = maxGridHeight;\n\n calculateSpanningElementDimensions();\n };\n\n const calculateSpanningElementDimensions = () => {\n const spanDimensions = new Map<string, { width: number; left: number }>();\n const masterCols = newGrid.masterColumns;\n\n for (const [mcIdx, masterColumn] of masterCols.entries()) {\n const sections = masterColumn.sections;\n\n for (const [secIdx, section] of sections.entries()) {\n const subColumns = section.subColumns;\n\n for (const [scIdx, subColumn] of subColumns.entries()) {\n const elements = subColumn.elements;\n\n for (const element of elements) {\n if (!element.span) continue;\n\n const span = element.span;\n const isStartPosition =\n mcIdx === span.masterColumnStart && secIdx === span.sectionStart && scIdx === span.subColumnStart;\n\n const spanKey = `${span.masterColumnStart}-${span.masterColumnEnd}-${span.sectionStart}-${span.sectionEnd}-${span.subColumnStart}-${span.subColumnEnd}`;\n\n if (isStartPosition && !spanDimensions.has(spanKey)) {\n const totalSpannedWidth = calculateSpannedWidth(span, masterCols);\n const spanStartLeft = calculateSpanStartLeft(span, masterCols);\n const width = config.spanElementWidth;\n\n // Winner bracket rounds span two lower bracket columns. Left-align them within that\n // span (factor 0) instead of centering (factor 0.5) so each winner round n sits above\n // the lower bracket round its losers drop into (round 2n-2) - the round whose matches\n // merge into the next one. That makes the participant's drop target unambiguous. Every\n // other spanning round (e.g. lower rounds split across sub-columns) stays centered.\n const round = element.type === 'header' || element.type === 'match' ? element.round : null;\n const alignFactor = round?.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET ? 0 : 0.5;\n\n spanDimensions.set(spanKey, { width, left: spanStartLeft + (totalSpannedWidth - width) * alignFactor });\n }\n\n const storedDimensions = spanDimensions.get(spanKey);\n if (storedDimensions) {\n element.dimensions.width = storedDimensions.width;\n element.dimensions.left = storedDimensions.left;\n element.isHidden = !isStartPosition;\n }\n }\n }\n }\n }\n };\n\n const calculateSpannedWidth = (\n span: BracketElementSpanCoordinates,\n masterColumns: ReadonlyArray<BracketMasterColumn<TRoundData, TMatchData>>,\n ) => {\n const key = `${span.masterColumnStart}-${span.masterColumnEnd}-${span.sectionStart}-${span.sectionEnd}-${span.subColumnStart}-${span.subColumnEnd}`;\n const cachedWidth = spannedWidthCache.get(key);\n\n if (cachedWidth !== undefined) return cachedWidth;\n\n if (span.masterColumnStart === span.masterColumnEnd) {\n const masterColumn = masterColumns[span.masterColumnStart];\n if (masterColumn) {\n const section = masterColumn.sections[span.sectionStart];\n if (section) {\n const subColumnWidth = section.dimensions.width / section.subColumns.length;\n const totalWidth = subColumnWidth * (span.subColumnEnd - span.subColumnStart + 1);\n spannedWidthCache.set(key, totalWidth);\n\n return totalWidth;\n }\n }\n spannedWidthCache.set(key, 0);\n\n return 0;\n }\n\n let totalWidth = 0;\n for (let mcIdx = span.masterColumnStart; mcIdx <= span.masterColumnEnd; mcIdx++) {\n const masterColumn = masterColumns[mcIdx];\n if (!masterColumn) continue;\n\n if (mcIdx === span.masterColumnStart) {\n const section = masterColumn.sections[span.sectionStart];\n if (section) {\n const subColumnWidth = section.dimensions.width / section.subColumns.length;\n totalWidth += subColumnWidth * (section.subColumns.length - span.subColumnStart);\n }\n } else if (mcIdx === span.masterColumnEnd) {\n const section = masterColumn.sections[span.sectionEnd];\n if (section) {\n const subColumnWidth = section.dimensions.width / section.subColumns.length;\n totalWidth += subColumnWidth * (span.subColumnEnd + 1);\n }\n } else {\n totalWidth += masterColumn.dimensions.width;\n }\n }\n spannedWidthCache.set(key, totalWidth);\n return totalWidth;\n };\n\n const calculateSpanStartLeft = (\n span: BracketElementSpanCoordinates,\n masterColumns: ReadonlyArray<BracketMasterColumn<TRoundData, TMatchData>>,\n ) => {\n const key = `${span.masterColumnStart}-${span.sectionStart}-${span.subColumnStart}`;\n const cachedLeft = spanStartLeftCache.get(key);\n\n if (cachedLeft !== undefined) return cachedLeft;\n\n const startMasterColumn = masterColumns[span.masterColumnStart];\n if (!startMasterColumn) {\n spanStartLeftCache.set(key, 0);\n\n return 0;\n }\n\n let startLeft = startMasterColumn.dimensions.left;\n const section = startMasterColumn.sections[span.sectionStart];\n if (section) {\n startLeft += (section.dimensions.width / section.subColumns.length) * span.subColumnStart;\n }\n\n spanStartLeftCache.set(key, startLeft);\n return startLeft;\n };\n\n const setupElementSpans = () => {\n const masterCols = newGrid.masterColumns;\n for (const [mcIdx, masterColumn] of masterCols.entries()) {\n const sections = masterColumn.sections;\n\n for (const [secIdx, section] of sections.entries()) {\n const subColumns = section.subColumns;\n\n for (const [scIdx, subColumn] of subColumns.entries()) {\n if (subColumn.span.isStart && subColumn.span.isEnd) continue;\n\n let spanStart = { masterColumnIndex: mcIdx, sectionIndex: secIdx, subColumnIndex: scIdx };\n if (!subColumn.span.isStart) {\n outer: for (let m = mcIdx; m >= 0; m--) {\n const mc = masterCols[m];\n if (!mc) continue;\n const sec = mc.sections[secIdx];\n if (!sec) continue;\n const end = m === mcIdx ? scIdx : sec.subColumns.length - 1;\n for (let s = end; s >= 0; s--) {\n if (sec.subColumns[s]?.span.isStart) {\n spanStart = { masterColumnIndex: m, sectionIndex: secIdx, subColumnIndex: s };\n break outer;\n }\n }\n }\n }\n\n let spanEnd = { masterColumnIndex: mcIdx, sectionIndex: secIdx, subColumnIndex: scIdx };\n if (!subColumn.span.isEnd) {\n outer: for (let m = mcIdx; m < masterCols.length; m++) {\n const mc = masterCols[m];\n if (!mc) continue;\n const sec = mc.sections[secIdx];\n if (!sec) continue;\n const start = m === mcIdx ? scIdx : 0;\n for (let s = start; s < sec.subColumns.length; s++) {\n if (sec.subColumns[s]?.span.isEnd) {\n spanEnd = { masterColumnIndex: m, sectionIndex: secIdx, subColumnIndex: s };\n break outer;\n }\n }\n }\n }\n\n const elements = subColumn.elements;\n for (const element of elements) {\n element.span = {\n masterColumnStart: spanStart.masterColumnIndex,\n masterColumnEnd: spanEnd.masterColumnIndex,\n sectionStart: spanStart.sectionIndex,\n sectionEnd: spanEnd.sectionIndex,\n subColumnStart: spanStart.subColumnIndex,\n subColumnEnd: spanEnd.subColumnIndex,\n };\n }\n }\n }\n }\n };\n\n return {\n grid: newGrid,\n pushMasterColumn,\n calculateDimensions,\n setupElementSpans,\n };\n};\n","import { BracketMasterColumnSection } from './bracket-master-column-section';\nimport { Dimensions, Spacing } from './types';\n\nexport type BracketMasterColumn<TRoundData, TMatchData> = {\n sections: ReadonlyArray<BracketMasterColumnSection<TRoundData, TMatchData>>;\n dimensions: Dimensions;\n padding: Spacing;\n};\n\nexport type CreateBracketMasterColumnConfig = {\n columnWidth: number;\n padding: Spacing;\n};\n\nexport type MutableBracketMasterColumn<TRoundData, TMatchData> = {\n masterColumn: BracketMasterColumn<TRoundData, TMatchData>;\n pushSection: (...sections: BracketMasterColumnSection<TRoundData, TMatchData>[]) => void;\n};\n\nexport const createBracketMasterColumn = <TRoundData, TMatchData>(\n config: CreateBracketMasterColumnConfig,\n): MutableBracketMasterColumn<TRoundData, TMatchData> => {\n const { columnWidth, padding } = config;\n\n const sections: BracketMasterColumnSection<TRoundData, TMatchData>[] = [];\n\n const newMasterColumn: BracketMasterColumn<TRoundData, TMatchData> = {\n dimensions: {\n width: columnWidth,\n height: 0,\n top: 0,\n left: 0,\n },\n padding,\n sections,\n };\n\n const pushSection = (...newSections: BracketMasterColumnSection<TRoundData, TMatchData>[]) => {\n sections.push(...newSections);\n };\n\n return {\n masterColumn: newMasterColumn,\n pushSection,\n };\n};\n","import { BracketSubColumn } from './bracket-sub-column';\nimport { Dimensions, Spacing } from './types';\n\nexport type BracketMasterColumnSectionType = 'round' | 'gap';\n\nexport type BracketMasterColumnSection<TRoundData, TMatchData> = {\n subColumns: ReadonlyArray<BracketSubColumn<TRoundData, TMatchData>>;\n dimensions: Dimensions;\n type: BracketMasterColumnSectionType;\n\n /** Overrides the master column padding for this section */\n padding?: Spacing;\n};\n\nexport type CreateBracketMasterColumnSectionConfig = {\n type: BracketMasterColumnSectionType;\n padding?: Spacing;\n};\n\nexport type MutableBracketMasterColumnSection<TRoundData, TMatchData> = {\n masterColumnSection: BracketMasterColumnSection<TRoundData, TMatchData>;\n pushSubColumn: (...subColumns: BracketSubColumn<TRoundData, TMatchData>[]) => void;\n};\n\nexport const createBracketMasterColumnSection = <TRoundData, TMatchData>(\n config: CreateBracketMasterColumnSectionConfig,\n): MutableBracketMasterColumnSection<TRoundData, TMatchData> => {\n const { type, padding } = config;\n\n const subColumns: BracketSubColumn<TRoundData, TMatchData>[] = [];\n\n const newMasterColumnSection: BracketMasterColumnSection<TRoundData, TMatchData> = {\n dimensions: {\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n },\n subColumns,\n type,\n padding,\n };\n\n const pushSubColumn = (...newSubColumns: BracketSubColumn<TRoundData, TMatchData>[]) => {\n subColumns.push(...newSubColumns);\n };\n\n return {\n masterColumnSection: newMasterColumnSection,\n pushSubColumn,\n };\n};\n","import { BracketElement } from './bracket-element';\nimport { Dimensions } from './types';\n\nexport type BracketSubColumn<TRoundData, TMatchData> = {\n dimensions: Dimensions;\n elements: ReadonlyArray<BracketElement<TRoundData, TMatchData>>;\n span: BracketSubColumnSpan;\n};\n\nexport type BracketSubColumnSpan = {\n isStart: boolean;\n isEnd: boolean;\n};\n\nexport type CreateBracketSubColumnConfig = {\n span: BracketSubColumnSpan;\n};\n\nexport type MutableBracketSubColumn<TRoundData, TMatchData> = {\n subColumn: BracketSubColumn<TRoundData, TMatchData>;\n pushElement: (...elements: BracketElement<TRoundData, TMatchData>[]) => void;\n};\n\nexport const createBracketSubColumn = <TRoundData, TMatchData>(\n config: CreateBracketSubColumnConfig,\n): MutableBracketSubColumn<TRoundData, TMatchData> => {\n const { span } = config;\n\n const elements: BracketElement<TRoundData, TMatchData>[] = [];\n\n const newSubColumn: BracketSubColumn<TRoundData, TMatchData> = {\n dimensions: {\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n },\n elements,\n span,\n };\n\n const pushElement = (...newElements: BracketElement<TRoundData, TMatchData>[]) => {\n elements.push(...newElements);\n };\n\n return {\n subColumn: newSubColumn,\n pushElement,\n };\n};\n","import { COMMON_BRACKET_ROUND_TYPE } from '../../../core';\nimport { Bracket, BracketMatch } from '../../../linked';\nimport {\n BracketContinueComponent,\n BracketMasterColumn,\n createBracketElement,\n createBracketMasterColumn,\n createBracketMasterColumnSection,\n createBracketSubColumn,\n} from '../core';\nimport { BracketRuntimeError } from '../../../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../../../bracket-errors';\n\nexport const isBracketContinueMatch = <TRoundData, TMatchData>(match: BracketMatch<TRoundData, TMatchData>) =>\n match.round.type !== COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE &&\n (match.relation.type === 'one-to-nothing' || match.relation.type === 'two-to-nothing');\n\nexport const getBracketContinueMatches = <TRoundData, TMatchData>(\n bracketData: Bracket<TRoundData, TMatchData>,\n): BracketMatch<TRoundData, TMatchData>[] =>\n Array.from(bracketData.matches.values()).filter((match) => isBracketContinueMatch(match));\n\nexport type CreateBracketContinueMasterColumnConfig<TRoundData, TMatchData> = {\n existingMasterColumns: ReadonlyArray<BracketMasterColumn<TRoundData, TMatchData>>;\n columnWidth: number;\n elementHeight: number;\n\n /** Vertical space taken by the round header block (header + gap). 0 if headers are hidden. */\n headerOffset: number;\n component: BracketContinueComponent<TRoundData, TMatchData>;\n matches: BracketMatch<TRoundData, TMatchData>[];\n};\n\nexport const createBracketContinueMasterColumn = <TRoundData, TMatchData>(\n config: CreateBracketContinueMasterColumnConfig<TRoundData, TMatchData>,\n) => {\n const { existingMasterColumns, columnWidth, elementHeight, headerOffset, component, matches } = config;\n\n const lastMasterColumn = existingMasterColumns[existingMasterColumns.length - 1];\n\n if (!lastMasterColumn) {\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.GRID_INVALID,\n 'No last master column found in existing master columns',\n );\n }\n\n // Dimensions are not calculated yet at this point, but all part heights are static, so the\n // total column height is the sum of the tallest sub column of every section.\n const totalHeight = lastMasterColumn.sections.reduce((height, section) => {\n const sectionHeight = Math.max(\n 0,\n ...section.subColumns.map((subColumn) =>\n subColumn.elements.reduce(\n (subColumnHeight, element) =>\n subColumnHeight + element.parts.reduce((sum, part) => sum + part.dimensions.height, 0),\n 0,\n ),\n ),\n );\n\n return height + sectionHeight;\n }, 0);\n\n const { masterColumn, pushSection } = createBracketMasterColumn<TRoundData, TMatchData>({\n columnWidth,\n padding: {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n },\n });\n\n const { masterColumnSection, pushSubColumn } = createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'round',\n });\n\n const { subColumn, pushElement } = createBracketSubColumn<TRoundData, TMatchData>({\n span: {\n isStart: true,\n isEnd: true,\n },\n });\n\n if (headerOffset > 0) {\n const { element: headerGapElement } = createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'colGap',\n elementHeight: headerOffset,\n partHeights: [headerOffset],\n });\n\n pushElement(headerGapElement);\n }\n\n const containerHeight = Math.max(elementHeight, totalHeight - headerOffset);\n\n const { element: continueElement } = createBracketElement<TRoundData, TMatchData>({\n area: 'continue',\n type: 'continue',\n elementHeight,\n partHeights: [containerHeight],\n component,\n matches,\n });\n\n pushElement(continueElement);\n\n pushSubColumn(subColumn);\n pushSection(masterColumnSection);\n\n return masterColumn;\n};\n","import { BracketPosition } from './math';\nimport { path, PathOptions } from './path';\n\nexport type LineOptions = {\n path: PathOptions;\n\n /** Draw right to left - the flow direction of a mirrored bracket's way back. */\n inverted?: boolean;\n};\n\n// eslint-disable-next-line max-params -- geometry helper: (from, to, options) reads naturally positional\nexport const linePath = (from: BracketPosition, to: BracketPosition, options: LineOptions) => {\n const inverted = options.inverted ?? false;\n\n const fromInline = inverted ? from.inline.start : from.inline.end;\n const toInline = inverted ? to.inline.end : to.inline.start;\n\n return path(`M ${fromInline} ${from.block.center} L ${toInline} ${to.block.center}`, options.path);\n};\n\n/**\n * The connector between two cards sharing a column, where {@link linePath} and `curvePath` both\n * degenerate to a zero-width horizontal run: straight down (or up) the column, edge to edge.\n */\n// eslint-disable-next-line max-params -- geometry helper: (from, to, options) reads naturally positional\nexport const verticalPath = (from: BracketPosition, to: BracketPosition, options: LineOptions) => {\n const inline = (from.inline.center + to.inline.center) / 2;\n const isDownwards = to.block.center >= from.block.center;\n\n const fromBlock = isDownwards ? from.block.end : from.block.start;\n const toBlock = isDownwards ? to.block.start : to.block.end;\n\n return path(`M ${inline} ${fromBlock} V ${toBlock}`, options.path);\n};\n\nexport type GutterLineOptions = LineOptions & {\n /** How far past the column's edge the vertical run sits - half a column gap keeps it clear of both. */\n gutter: number;\n};\n\n/**\n * A same-column connector for two cards with others stacked between them: out sideways, along the\n * empty strip beside the column, and back in. {@link verticalPath} would run through everything in\n * its way.\n */\n// eslint-disable-next-line max-params -- geometry helper: (from, to, options) reads naturally positional\nexport const gutterPath = (from: BracketPosition, to: BracketPosition, options: GutterLineOptions) => {\n const inverted = options.inverted ?? false;\n\n const fromInline = inverted ? from.inline.start : from.inline.end;\n const toInline = inverted ? to.inline.start : to.inline.end;\n const runInline = inverted\n ? Math.min(fromInline, toInline) - options.gutter\n : Math.max(fromInline, toInline) + options.gutter;\n\n return path(`M ${fromInline} ${from.block.center} H ${runInline} V ${to.block.center} H ${toInline}`, options.path);\n};\n","import { BRACKET_ROUND_MIRROR_TYPE, COMMON_BRACKET_ROUND_TYPE } from '../core';\nimport { CurveOptions, curvePath } from './curve';\nimport { Dimensions } from './grid/core/types';\nimport { ComputedBracketGrid } from './grid/types';\nimport { isBracketContinueMatch } from './grid/prebuild/bracket-continue-master-column';\nimport { gutterPath, linePath, LineOptions, verticalPath } from './line';\nimport { BracketPosition } from './math';\nimport { path, PathOptions } from './path';\nimport { BracketDrawing, BracketEdge } from './shapes';\n\nexport type DrawManDimensions<TRoundData, TMatchData> = {\n columnWidth: number;\n matchHeight: number;\n roundHeaderHeight: number;\n columnGap: number;\n upperLowerGap: number;\n rowGap: number;\n bracketGrid: ComputedBracketGrid<TRoundData, TMatchData>;\n path: Omit<PathOptions, 'className' | 'id'>;\n curve: Omit<CurveOptions, 'path' | 'inverted'>;\n\n /** Path options for the lines connecting the continuing matches to the continue element */\n continuePath?: Omit<PathOptions, 'className' | 'id'>;\n};\n\nconst makePos = (dimensions: Dimensions): BracketPosition => ({\n block: {\n start: dimensions.top,\n end: dimensions.top + dimensions.height,\n center: dimensions.top + dimensions.height / 2,\n },\n inline: {\n start: dimensions.left,\n end: dimensions.left + dimensions.width,\n center: dimensions.left + dimensions.width / 2,\n },\n});\n\n/**\n * Two cards in the same column - the shape a stacked layout's centre chain makes, where a round hangs\n * directly below the one that feeds it and every horizontal run has zero width.\n */\nconst isSameColumn = (from: BracketPosition, to: BracketPosition) =>\n Math.abs(from.inline.center - to.inline.center) < 1;\n\n/** A one-to-one connector, whichever way round the two cards sit. */\n// eslint-disable-next-line max-params -- geometry helper: (from, to, options) reads naturally positional\nconst straightPath = (from: BracketPosition, to: BracketPosition, options: LineOptions) =>\n isSameColumn(from, to) ? verticalPath(from, to, options) : linePath(from, to, options);\n\n/** One arm of a merge, collapsing to a straight run when the two cards share a column. */\nconst mergePath = (\n from: BracketPosition,\n to: BracketPosition,\n direction: 'up' | 'down',\n options: CurveOptions,\n // eslint-disable-next-line max-params -- mirrors curvePath's (from, to, direction, options)\n) =>\n isSameColumn(from, to) ? verticalPath(from, to, { path: options.path }) : curvePath(from, to, direction, options);\n\nconst edgeId = (fromMatchId: string, toMatchId: string) => `${fromMatchId}|${toMatchId}`;\n\nexport const drawMan = <TRoundData, TMatchData>(\n dimensions: DrawManDimensions<TRoundData, TMatchData>,\n): BracketDrawing => {\n const edges: BracketEdge[] = [];\n const takenIds = new Set<string>();\n\n // A repeated id would make the host's `@for` throw, and a mirrored fold can draw the same pair of\n // cards from both of its sides.\n const pushEdge = (edge: BracketEdge) => {\n let id = edge.id;\n\n for (let attempt = 2; takenIds.has(id); attempt++) id = `${edge.id}#${attempt}`;\n\n takenIds.add(id);\n edges.push(id === edge.id ? edge : { ...edge, id });\n };\n\n const continueElement = dimensions.bracketGrid.columns\n .flatMap((col) => col.elements)\n .find((el) => el.type === 'continue');\n const continuePos = continueElement ? makePos(continueElement.dimensions) : null;\n const continueSources: { pos: BracketPosition; className: string; matchId: string }[] = [];\n\n for (const col of dimensions.bracketGrid.columns) {\n for (const el of col.elements) {\n if (el.type !== 'match') continue;\n\n const currentMatchParticipantsShortIds = [el.match.home?.shortId, el.match.away?.shortId]\n .filter((id) => !!id)\n .join(' ');\n\n const currentPos = makePos(el.dimensions);\n\n // No lines for the third place match\n if (el.round.type === COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE) continue;\n\n if (continuePos && isBracketContinueMatch(el.match)) {\n continueSources.push({\n pos: currentPos,\n className: el.match.winner?.shortId || '',\n matchId: el.match.id,\n });\n }\n\n // Crossing the middle of a fold. Every other line here is drawn by the match it flows *into*, but a\n // round in the middle of a mirrored bracket is fed from both sides and its relation names only one\n // of them - so the round on the way back draws its own line. Deliberately outside the switch below:\n // which relation a match has says nothing about which side of a fold it sits on, and keying this to\n // `two-to-one` is why a folded lower bracket used to lose the line into its centre round.\n if (el.round.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT && 'nextMatch' in el.match.relation) {\n const { nextMatch, nextRound } = el.match.relation;\n\n if (nextRound.mirrorRoundType === null) {\n const next = dimensions.bracketGrid.matchElementMap.getOrThrow(nextMatch.id);\n\n // The winner's short id, not both participants': this line is somebody advancing along it, and\n // the journey highlight lights the path a participant actually travelled.\n pushEdge(\n straightPath(makePos(next.dimensions), currentPos, {\n path: {\n ...dimensions.path,\n id: edgeId(nextMatch.id, el.match.id),\n className: el.match.winner?.shortId || '',\n },\n }),\n );\n }\n }\n\n switch (el.match.relation.type) {\n case 'nothing-to-one': {\n continue;\n }\n case 'one-to-nothing':\n case 'one-to-one': {\n const prev = dimensions.bracketGrid.matchElementMap.getOrThrow(el.match.relation.previousMatch.id);\n const prevPos = makePos(prev.dimensions);\n\n // The winner of the match it comes from, like every other connector - this used to carry both of\n // the *current* match's participants, which lit the line for whoever arrived from somewhere else.\n pushEdge(\n straightPath(prevPos, currentPos, {\n path: {\n ...dimensions.path,\n id: edgeId(el.match.relation.previousMatch.id, el.match.id),\n className: el.match.relation.previousMatch.winner?.shortId || '',\n },\n // The way back runs right to left: the round it comes from sits on the *other* side.\n inverted: el.round.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT,\n }),\n );\n\n break;\n }\n\n case 'two-to-nothing':\n case 'two-to-one': {\n const prevUpper = dimensions.bracketGrid.matchElementMap.getOrThrow(el.match.relation.previousUpperMatch.id);\n const prevLower = dimensions.bracketGrid.matchElementMap.getOrThrow(el.match.relation.previousLowerMatch.id);\n\n const prevUpperPos = makePos(prevUpper.dimensions);\n const prevLowerPos = makePos(prevLower.dimensions);\n\n const upperId = edgeId(el.match.relation.previousUpperMatch.id, el.match.id);\n const lowerId = edgeId(el.match.relation.previousLowerMatch.id, el.match.id);\n\n const isLowerUpperMerger =\n el.match.relation.previousLowerRound.id !== el.match.relation.previousUpperRound.id;\n\n const invertCurve = el.round.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT;\n\n const curveOptions: CurveOptions = {\n ...dimensions.curve,\n inverted: invertCurve,\n path: { ...dimensions.path, id: upperId, className: '' },\n };\n\n if (isLowerUpperMerger) {\n pushEdge(\n straightPath(prevUpperPos, currentPos, {\n path: { ...dimensions.path, id: upperId, className: currentMatchParticipantsShortIds },\n inverted: invertCurve,\n }),\n );\n } else {\n // draw two lines that merge into one in the middle\n pushEdge(\n mergePath(prevUpperPos, currentPos, 'down', {\n ...curveOptions,\n path: {\n ...curveOptions.path,\n className: el.match.relation.previousUpperMatch.winner?.shortId || '',\n },\n }),\n );\n }\n\n const lowerPathOptions = {\n ...curveOptions.path,\n id: lowerId,\n className: el.match.relation.previousLowerMatch.winner?.shortId || '',\n };\n\n // A feeder directly *below* in the same column is the one connector a stacked layout has that\n // crosses its own cards - the losers champion coming up to the grand final, past everything\n // hanging under it. Every other same-column pair is adjacent, so a straight run is clear.\n const isBlockToBlock =\n isSameColumn(prevLowerPos, currentPos) && prevLowerPos.block.start > currentPos.block.end;\n\n pushEdge(\n isBlockToBlock\n ? gutterPath(prevLowerPos, currentPos, {\n // Dashed, like the continue column's: it runs the height of a block past cards it has\n // nothing to do with, and reads as a stray bracket edge if it looks like one.\n path: {\n ...(dimensions.continuePath ?? dimensions.path),\n id: lowerId,\n className: lowerPathOptions.className,\n },\n inverted: invertCurve,\n gutter: dimensions.columnGap / 2,\n })\n : mergePath(prevLowerPos, currentPos, 'up', { ...curveOptions, path: lowerPathOptions }),\n );\n\n break;\n }\n }\n }\n }\n\n if (continuePos && continueSources.length) {\n const continuePathOptions = dimensions.continuePath ?? dimensions.path;\n const curveAmount = dimensions.curve.lineStartingCurveAmount;\n const trunkInline = continuePos.inline.start - dimensions.columnGap / 2;\n const continueBlockCenter = continuePos.block.center;\n const sourceBlocks = continueSources.map((source) => source.pos.block.center);\n const firstSourceBlock = Math.min(...sourceBlocks);\n const lastSourceBlock = Math.max(...sourceBlocks);\n const trunkBlocks: number[] = [continueBlockCenter];\n\n for (const source of continueSources) {\n const sourceBlockCenter = source.pos.block.center;\n const blockDistance = continueBlockCenter - sourceBlockCenter;\n const sourcePathOptions: PathOptions = {\n ...continuePathOptions,\n id: edgeId(source.matchId, 'continue'),\n className: source.className,\n };\n\n const isTrunkCorner =\n (sourceBlockCenter === firstSourceBlock && blockDistance > 0.5) ||\n (sourceBlockCenter === lastSourceBlock && blockDistance < -0.5);\n\n // The straight run into the trunk is the same three commands with a zero-radius corner, so that a\n // source turning into a corner as the rows move animates rather than jumping.\n const curve = isTrunkCorner ? Math.min(curveAmount, Math.abs(blockDistance)) : 0;\n const curveEndBlock = sourceBlockCenter + curve * Math.sign(blockDistance);\n\n pushEdge(\n path(\n `M ${source.pos.inline.end} ${sourceBlockCenter}\n H ${trunkInline - curve}\n Q ${trunkInline} ${sourceBlockCenter}, ${trunkInline} ${curveEndBlock}`,\n sourcePathOptions,\n ),\n );\n\n trunkBlocks.push(curveEndBlock);\n }\n\n const trunkBlockStart = Math.min(...trunkBlocks);\n const trunkBlockEnd = Math.max(...trunkBlocks);\n\n if (trunkBlockEnd - trunkBlockStart > 0.5) {\n pushEdge(\n path(`M ${trunkInline} ${trunkBlockStart} V ${trunkBlockEnd}`, {\n ...continuePathOptions,\n id: 'continue|trunk',\n className: '',\n }),\n );\n }\n\n pushEdge(\n path(`M ${trunkInline} ${continueBlockCenter} H ${continuePos.inline.start}`, {\n ...continuePathOptions,\n id: 'continue|element',\n className: '',\n }),\n );\n }\n\n return { edges, rects: [], gradients: [] };\n};\n","import {\n BracketMap,\n BracketMatchId,\n BracketMatchParticipantBase,\n BracketRoundId,\n SWISS_ADVANCE_WINS,\n SWISS_ELIMINATE_LOSSES,\n TOURNAMENT_MODE,\n} from '../core';\nimport { Bracket, BracketMatch } from './bracket';\n\nexport type BracketRoundSwissGroupId = string & { _brand: 'BracketRoundSwissGroupId' };\n\nexport type BracketRoundSwissGroup<TRoundData, TMatchData> = {\n id: BracketRoundSwissGroupId;\n name: string;\n matches: BracketMap<BracketMatchId, BracketMatch<TRoundData, TMatchData>>;\n allowedMatchCount: number;\n};\n\nexport type BracketRoundSwissGroupMap<TRoundData, TMatchData> = Map<\n BracketRoundSwissGroupId,\n BracketRoundSwissGroup<TRoundData, TMatchData>\n>;\n\nexport type BracketRoundSwissData<TRoundData, TMatchData> = {\n groups: BracketRoundSwissGroupMap<TRoundData, TMatchData>;\n};\n\nexport type BracketRoundMapWithSwissData<TRoundData, TMatchData> = Map<\n BracketRoundId,\n BracketRoundSwissData<TRoundData, TMatchData>\n>;\n\nexport const BRACKET_SWISS_GROUP_COLOR_TYPE = {\n /** The starting group (0-0) */\n NEUTRAL: 'neutral',\n\n /** The group has more wins than losses */\n POSITIVE: 'positive',\n\n /** The group is one loss away from elimination */\n NEGATIVE: 'negative',\n\n /** Everything in between */\n WARNING: 'warning',\n} as const;\n\nexport type BracketSwissGroupColorType =\n (typeof BRACKET_SWISS_GROUP_COLOR_TYPE)[keyof typeof BRACKET_SWISS_GROUP_COLOR_TYPE];\n\n/**\n * Colors for the swiss group borders and connection lines, keyed by the group color type\n * (see {@link getSwissGroupColorType}). Connection lines are drawn in the neutral color and fade\n * into the target group color on the last portion before touching its border.\n * Any CSS color value is allowed. Missing entries fall back to the connector/border color\n * (the `--et-bracket-line-color` / `--et-bracket-swiss-group-border-color` custom properties,\n * which default to `--et-surface-border-solid`).\n */\nexport type BracketSwissColors = Partial<Record<BracketSwissGroupColorType, string>>;\n\nexport const getSwissGroupColorType = (wins: number, losses: number): BracketSwissGroupColorType => {\n if (wins === 0 && losses === 0) return BRACKET_SWISS_GROUP_COLOR_TYPE.NEUTRAL;\n if (losses === SWISS_ELIMINATE_LOSSES - 1) return BRACKET_SWISS_GROUP_COLOR_TYPE.NEGATIVE;\n if (wins > losses) return BRACKET_SWISS_GROUP_COLOR_TYPE.POSITIVE;\n\n return BRACKET_SWISS_GROUP_COLOR_TYPE.WARNING;\n};\n\nconst factorialCache = /* @__PURE__ */ new Map<number, number>();\n\nexport const getAvailableSwissGroupsForRound = (roundNumber: number, totalMatchesInRound: number) => {\n const advanceWins = SWISS_ADVANCE_WINS;\n const eliminateLosses = SWISS_ELIMINATE_LOSSES;\n\n // Cache factorial calculations\n const getFactorial = (n: number): number => {\n if (n <= 1) return 1;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (factorialCache.has(n)) return factorialCache.get(n)!;\n\n const result = n * getFactorial(n - 1);\n factorialCache.set(n, result);\n return result;\n };\n\n // Pre-calculate roundFactorial\n const roundFactorial = getFactorial(roundNumber);\n\n let totalCombinations = 0;\n const validGroups: { wins: number; losses: number; combinations: number }[] = [];\n\n // Single loop to gather valid groups and total combinations\n for (let wins = roundNumber; wins >= 0; wins--) {\n const losses = roundNumber - wins;\n const remainingGames = advanceWins + eliminateLosses - (wins + losses) - 1;\n const notYetEliminated = losses < eliminateLosses;\n const canStillAdvance = wins < advanceWins && remainingGames >= 0;\n\n if (!canStillAdvance || !notYetEliminated) continue;\n\n const combinations = roundFactorial / (getFactorial(wins) * getFactorial(losses));\n totalCombinations += combinations;\n validGroups.push({ wins, losses, combinations });\n }\n\n // Create final groups with calculated proportions\n return validGroups.map(({ wins, losses, combinations }) => ({\n id: `${wins}-${losses}` as BracketRoundSwissGroupId,\n name: `${wins}-${losses}`,\n matchesInGroup: Math.round((combinations / totalCombinations) * totalMatchesInRound),\n }));\n};\n\n/** The group an undrawn match falls into when its round has no win/loss record to group by. */\nconst UNDRAWN_SWISS_GROUP_ID = 'undrawn' as BracketRoundSwissGroupId;\n\nconst getRecordBeforeMatch = (participant: BracketMatchParticipantBase) => ({\n wins: participant.winCount - (participant.result === 'win' ? 1 : 0),\n losses: participant.lossCount - (participant.result === 'loss' ? 1 : 0),\n});\n\nexport const generateBracketRoundSwissGroupMaps = <TRoundData, TMatchData>(\n bracketData: Bracket<TRoundData, TMatchData>,\n) => {\n if (bracketData.mode !== TOURNAMENT_MODE.SWISS_WITH_ELIMINATION) {\n return null;\n }\n\n const roundsWithSwissGroups: BracketRoundMapWithSwissData<TRoundData, TMatchData> = new Map();\n\n let roundNumber = 0;\n for (const bracketRound of bracketData.rounds.values()) {\n const availableGroups = getAvailableSwissGroupsForRound(roundNumber, bracketRound.matchCount);\n\n const roundSwissData: BracketRoundSwissData<TRoundData, TMatchData> = {\n groups: new Map(),\n };\n\n for (const group of availableGroups) {\n const subGroup: BracketRoundSwissGroup<TRoundData, TMatchData> = {\n id: group.id,\n name: group.name,\n matches: new BracketMap(),\n allowedMatchCount: group.matchesInGroup,\n };\n\n roundSwissData.groups.set(group.id, subGroup);\n }\n\n const emptyMatchIds: BracketMatchId[] = [];\n\n for (const match of bracketRound.matches.values()) {\n const anyParticipant = match.home || match.away;\n\n if (!anyParticipant) {\n emptyMatchIds.push(match.id);\n continue;\n }\n\n const { wins, losses } = getRecordBeforeMatch(anyParticipant);\n const groupId = `${wins}-${losses}` as BracketRoundSwissGroupId;\n\n // The table above enumerates the records of somebody who played every round. A bye, a walkover or\n // an uneven field leaves a participant with fewer games than the round index, so their group is\n // real but not in the table - create it rather than losing the whole bracket over one match.\n let group = roundSwissData.groups.get(groupId);\n\n if (!group) {\n group = { id: groupId, name: `${wins}-${losses}`, matches: new BracketMap(), allowedMatchCount: 0 };\n roundSwissData.groups.set(groupId, group);\n }\n\n group.matches.set(match.id, match);\n }\n\n for (const emptyMatchId of emptyMatchIds) {\n const match = bracketRound.matches.getOrThrow(emptyMatchId);\n const groups = [...roundSwissData.groups.values()];\n let group =\n groups.find((candidate) => candidate.matches.size < candidate.allowedMatchCount) ??\n groups.reduce<BracketRoundSwissGroup<TRoundData, TMatchData> | null>(\n (fewest, candidate) => (!fewest || candidate.matches.size < fewest.matches.size ? candidate : fewest),\n null,\n );\n\n // A round past the last one a 3-3 swiss can reach - the elimination rounds of a\n // swiss-with-elimination stage - has no record groups, and an undrawn match carries no record to\n // build one from. A nameless group keeps the round drawn instead of losing the whole bracket.\n if (!group) {\n group = { id: UNDRAWN_SWISS_GROUP_ID, name: '', matches: new BracketMap(), allowedMatchCount: 0 };\n roundSwissData.groups.set(group.id, group);\n }\n\n group.matches.set(match.id, match);\n }\n\n for (const [groupId, group] of roundSwissData.groups) {\n if (!group.matches.size) roundSwissData.groups.delete(groupId);\n }\n\n // The map is drawn top to bottom in insertion order, so a group created on demand has to be sorted\n // back into the best-record-first order the table was built in.\n const orderedGroups = [...roundSwissData.groups.entries()].sort(([a], [b]) => {\n const [aWins = 0, aLosses = 0] = a.split('-').map(Number);\n const [bWins = 0, bLosses = 0] = b.split('-').map(Number);\n\n return bWins - aWins || aLosses - bLosses;\n });\n\n roundSwissData.groups = new Map(orderedGroups);\n\n roundsWithSwissGroups.set(bracketRound.id, roundSwissData);\n\n roundNumber++;\n }\n\n return roundsWithSwissGroups;\n};\n","import { BracketRoundId } from '../core';\nimport { BracketSwissColors, BracketSwissGroupColorType, getSwissGroupColorType } from '../linked/swiss';\nimport { curvePath } from './curve';\nimport { FinalizedBracketElement, FinalizedMatchBracketElement } from './grid/core/bracket-finalizer';\nimport { ComputedBracketGrid } from './grid/types';\nimport { BracketPosition } from './math';\nimport { PathOptions } from './path';\nimport { BracketDrawing, BracketEdge, BracketGradient, BracketRect } from './shapes';\nimport { BracketRuntimeError } from '../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../bracket-errors';\n\nexport type DrawSwissManDimensions<TRoundData, TMatchData> = {\n bracketGrid: ComputedBracketGrid<TRoundData, TMatchData>;\n path: Omit<PathOptions, 'className' | 'stroke' | 'id'>;\n\n // The swiss connection lines always bend twice with the same radius, so there is no\n // dedicated ending curve amount (it would make no sense here).\n curve: {\n lineStartingCurveAmount: number;\n };\n groupBorder: {\n padding: number;\n radius: number;\n width: number;\n };\n colors?: BracketSwissColors;\n\n /** Used to create document wide unique ids for the connection line gradients */\n idPrefix: string;\n};\n\ntype SwissGroupGeometry = {\n id: string;\n wins: number;\n losses: number;\n colorType: BracketSwissGroupColorType;\n position: BracketPosition;\n winnerShortIds: string[];\n loserShortIds: string[];\n};\n\ntype SwissRoundGeometry = {\n groups: Map<string, SwissGroupGeometry>;\n};\n\n// Every finalized column of a swiss grid is one group section. The connection lines run\n// from group to group instead of match to match: the winners of group (w-l) move to group\n// (w+1-l) inside the next round, the losers move to group (w-l+1).\nconst collectSwissRoundGeometries = <TRoundData, TMatchData>(\n bracketGrid: ComputedBracketGrid<TRoundData, TMatchData>,\n): SwissRoundGeometry[] => {\n const rounds = new Map<BracketRoundId, SwissRoundGeometry>();\n\n for (const column of bracketGrid.columns) {\n const matchElements = column.elements.filter(\n (\n element: FinalizedBracketElement<TRoundData, TMatchData>,\n ): element is FinalizedMatchBracketElement<TRoundData, TMatchData> => element.type === 'match',\n );\n const group = matchElements[0]?.roundSwissGroup;\n const round = matchElements[0]?.round;\n\n if (!group || !round) continue;\n\n const [wins, losses] = group.id.split('-').map(Number);\n\n if (wins === undefined || losses === undefined || isNaN(wins) || isNaN(losses)) {\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.SWISS_GROUPING_FAILED,\n `Unable to parse wins and losses from Swiss group id: ${group.id}`,\n );\n }\n\n const matchesTop = Math.min(...matchElements.map((element) => element.dimensions.top));\n const matchesBottom = Math.max(\n ...matchElements.map((element) => element.dimensions.top + element.dimensions.height),\n );\n\n const winnerShortIds: string[] = [];\n const loserShortIds: string[] = [];\n\n for (const element of matchElements) {\n if (!element.match.winner) continue;\n\n const winner = element.match.winner;\n const loser = element.match.home?.id === winner.id ? element.match.away : element.match.home;\n\n winnerShortIds.push(winner.shortId);\n if (loser) loserShortIds.push(loser.shortId);\n }\n\n // The lines attach to the group border, which wraps the matches plus the group\n // padding and therefore matches the section bounds horizontally.\n const position: BracketPosition = {\n block: {\n start: matchesTop,\n end: matchesBottom,\n center: (matchesTop + matchesBottom) / 2,\n },\n inline: {\n start: column.dimensions.left,\n end: column.dimensions.left + column.dimensions.width,\n center: column.dimensions.left + column.dimensions.width / 2,\n },\n };\n\n let roundGeometry = rounds.get(round.id);\n\n if (!roundGeometry) {\n roundGeometry = { groups: new Map() };\n rounds.set(round.id, roundGeometry);\n }\n\n roundGeometry.groups.set(group.id, {\n id: group.id,\n wins,\n losses,\n colorType: getSwissGroupColorType(wins, losses),\n position,\n winnerShortIds,\n loserShortIds,\n });\n }\n\n // The finalized columns are ordered left to right, so first appearance equals round order\n return Array.from(rounds.values());\n};\n\nconst groupBorderRect = (\n group: SwissGroupGeometry,\n border: DrawSwissManDimensions<unknown, unknown>['groupBorder'],\n color: string | undefined,\n id: string,\n // eslint-disable-next-line max-params -- SVG geometry helper; (group, border, color, id) are distinct positional inputs\n): BracketRect => {\n // The group box wraps the matches plus the group padding plus the border itself. The\n // rect is inset by half the stroke width so the stroke renders fully inside the group\n // bounds instead of getting cut off at the edges of the bracket container.\n const boxPadding = border.padding + border.width;\n const strokeInset = border.width / 2;\n\n return {\n id,\n x: group.position.inline.start + strokeInset,\n y: group.position.block.start - boxPadding + strokeInset,\n width: group.position.inline.end - group.position.inline.start - border.width,\n height: group.position.block.end - group.position.block.start + boxPadding * 2 - border.width,\n radius: border.radius,\n stroke: color ?? 'currentColor',\n strokeWidth: border.width,\n cssClass: `et-bracket-swiss-group-border et-bracket-swiss-group-border--${group.id} et-bracket-swiss-group-border--${group.colorType}`,\n };\n};\n\ntype SwissLineGradient = {\n id: string;\n fromX: number;\n toX: number;\n from: string;\n neutral: string;\n to: string;\n};\n\n// A horizontal gradient for the connection lines: they leave the source group in its\n// color, fade to the neutral color towards their vertical jog in the middle and fade into\n// the target group color on the second half. The connection lines always run from left to\n// right, so user space coordinates can be used (they also work for straight lines, where\n// the bounding box has no height).\nconst lineGradient = (config: SwissLineGradient): BracketGradient => ({\n id: config.id,\n fromX: config.fromX,\n toX: config.toX,\n stops: [\n { offset: '0%', color: config.from },\n { offset: '50%', color: config.neutral },\n { offset: '100%', color: config.to },\n ],\n});\n\nexport const drawSwissMan = <TRoundData, TMatchData>(\n dimensions: DrawSwissManDimensions<TRoundData, TMatchData>,\n): BracketDrawing => {\n const edges: BracketEdge[] = [];\n const rects: BracketRect[] = [];\n const gradients: BracketGradient[] = [];\n\n const roundGeometries = collectSwissRoundGeometries(dimensions.bracketGrid);\n const colors = dimensions.colors;\n\n for (const [roundIndex, roundGeometry] of roundGeometries.entries()) {\n for (const group of roundGeometry.groups.values()) {\n rects.push(\n groupBorderRect(group, dimensions.groupBorder, colors?.[group.colorType], `r${roundIndex}|${group.id}`),\n );\n }\n }\n\n const curveOptions = {\n lineStartingCurveAmount: dimensions.curve.lineStartingCurveAmount,\n lineEndingCurveAmount: dimensions.curve.lineStartingCurveAmount,\n };\n\n for (const [roundIndex, roundGeometry] of roundGeometries.entries()) {\n const nextRoundGeometry = roundGeometries[roundIndex + 1];\n\n if (!nextRoundGeometry) break;\n\n for (const group of roundGeometry.groups.values()) {\n const targets = [\n { geometry: nextRoundGeometry.groups.get(`${group.wins + 1}-${group.losses}`), shortIds: group.winnerShortIds },\n { geometry: nextRoundGeometry.groups.get(`${group.wins}-${group.losses + 1}`), shortIds: group.loserShortIds },\n ];\n\n for (const { geometry: target, shortIds } of targets) {\n if (!target) continue;\n\n const edgeId = `r${roundIndex}|${group.id}|${target.id}`;\n // Only URI characters: this ends up inside a `url(#…)` the `stroke` attribute has to resolve.\n const gradientId = `${dimensions.idPrefix}-swiss-line-r${roundIndex}-${group.id}-to-${target.id}`;\n const neutralColor = colors?.neutral;\n\n let stroke = neutralColor;\n\n if (neutralColor) {\n const from = colors?.[group.colorType] ?? neutralColor;\n const to = colors?.[target.colorType] ?? neutralColor;\n\n if (from !== neutralColor || to !== neutralColor) {\n gradients.push(\n lineGradient({\n id: gradientId,\n fromX: group.position.inline.end,\n toX: target.position.inline.start,\n from,\n neutral: neutralColor,\n to,\n }),\n );\n\n stroke = `url(#${gradientId})`;\n }\n }\n\n const pathOptions: PathOptions = {\n ...dimensions.path,\n id: edgeId,\n className: shortIds.join(' '),\n stroke,\n };\n const blockDelta = target.position.block.center - group.position.block.center;\n\n // Always a curve, even between two groups on the same row, where the bends collapse to nothing\n // and it draws as a straight run - one shape per connector is what lets it animate.\n edges.push(\n curvePath(group.position, target.position, blockDelta < 0 ? 'up' : 'down', {\n ...curveOptions,\n path: pathOptions,\n }),\n );\n }\n }\n }\n\n return { edges, rects, gradients };\n};\n","export const calculateUpperLowerRatio = (upperRoundsCount: number, lowerRoundsCount: number) => {\n // In double elimination, after the first aligned column,\n // we need to distribute the remaining upper rounds across the remaining lower rounds\n const remainingUpperRounds = upperRoundsCount - 1; // Subtract the first round\n const remainingLowerRounds = lowerRoundsCount - 1; // Subtract the first round\n\n if (remainingUpperRounds === 0) {\n return 1; // Edge case: only one upper round\n }\n\n return remainingLowerRounds / remainingUpperRounds;\n};\n\nexport const calculateColumnSplitFactor = (upperToLowerRatio: number) => {\n // The split factor determines how many sub-columns each match column will have\n // For example, if the ratio is 1.5, we split each match column\n // into 2 sub-columns so that matches can be centered correctly\n\n if (upperToLowerRatio === 1.5) {\n return 2; // Split into 2 sub-columns for 1.5 ratio\n }\n\n if (upperToLowerRatio === 2) {\n return 1; // Split into 1 sub-columns for 2 ratio\n }\n\n return 1;\n};\n\nexport const calculateLowerRoundIndex = (subColumnIndex: number, splitFactor: number) =>\n Math.floor(subColumnIndex / splitFactor);\n\n// eslint-disable-next-line max-params -- index math over positional grid coordinates\nexport const calculateUpperRoundIndex = (subColumnIndex: number, upperToLowerRatio: number, splitFactor: number) => {\n // Calculate which complete column we're in\n const completeColumnIndex = Math.floor(subColumnIndex / splitFactor);\n\n // For the first complete column (index 0), always use the first upper round (index 0)\n if (completeColumnIndex === 0) {\n return 0;\n }\n\n // For subsequent columns, map based on the ratio\n // We subtract 1 because the first column is handled separately\n const adjustedColumnIndex = completeColumnIndex - 1;\n\n // Calculate which upper round this column should use\n // We add 1 because we start from the second upper round (index 1)\n return Math.floor(adjustedColumnIndex / upperToLowerRatio) + 1;\n};\n","import { COMMON_BRACKET_ROUND_TYPE, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE } from '../../../core';\nimport { BracketRound } from '../../../linked';\nimport {\n BracketComponents,\n BracketElementToCreate,\n BracketSubColumnSpan,\n createBracketElement,\n createBracketSubColumn,\n} from '../core';\nimport { CreateBracketGridConfig } from '../types';\n\nexport type CreateRoundBracketSubColumnRelativeToFirstRoundConfig<TRoundData, TMatchData> = {\n firstRound: BracketRound<TRoundData, TMatchData>;\n round: BracketRound<TRoundData, TMatchData>;\n span: BracketSubColumnSpan;\n hasReverseFinal: boolean;\n options: CreateBracketGridConfig;\n components: BracketComponents<TRoundData, TMatchData>;\n\n /**\n * Reserved space below the last match, for a layout whose columns are taller than the first round\n * needs - a stacked bracket's centre chain hanging past the bottom of its block.\n */\n bottomPadding?: number;\n\n /**\n * How many first-round rows each of this round's matches owns. Derived from the round's own match\n * count when unset; a folded round is placed by its offset instead and takes `1`.\n */\n matchFactor?: number;\n};\n\nexport const createRoundBracketSubColumnRelativeToFirstRound = <TRoundData, TMatchData>(\n config: CreateRoundBracketSubColumnRelativeToFirstRoundConfig<TRoundData, TMatchData>,\n) => {\n const { firstRound, round, options, span, hasReverseFinal } = config;\n\n const { subColumn, pushElement } = createBracketSubColumn<TRoundData, TMatchData>({\n span,\n });\n\n const matchFactor =\n config.matchFactor ?? Math.max(1, (options.rowSpanMatchCount ?? firstRound.matchCount) / round.matchCount);\n const matches = Array.from(round.matches.values());\n\n const isFinalRound = hasReverseFinal\n ? round.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL\n : round.type === COMMON_BRACKET_ROUND_TYPE.FINAL;\n\n const roundHeaderGap = isFinalRound\n ? Math.max(options.roundHeaderGap, options.finalRoundHeaderGap ?? 0)\n : options.roundHeaderGap;\n\n const elementsToCreate: Array<BracketElementToCreate<TRoundData, TMatchData>> = [];\n\n // Only include a header row if headers exist\n if (options.roundHeaderHeight > 0) {\n elementsToCreate.push(\n {\n type: 'header',\n area: `h${round.shortId}`,\n partHeights: [options.roundHeaderHeight],\n elementHeight: options.roundHeaderHeight,\n component: config.components.roundHeader,\n round,\n roundSwissGroup: null,\n },\n {\n type: 'roundHeaderGap',\n area: '.',\n partHeights: [roundHeaderGap],\n elementHeight: roundHeaderGap,\n },\n );\n }\n\n // Add match elements to create\n for (const [matchIndex, match] of matches.entries()) {\n const isLastMatch = matchIndex === matches.length - 1;\n\n // One row per match this one is fed by. A fractional factor has no whole feeder row to align to,\n // so floor it and let the block padding below absorb the remainder - rounding up instead emits a\n // row the block height cannot pay for, and the padding turns negative to compensate.\n const fedMatchCount = Math.floor(matchFactor);\n const matchRows: number[] = [];\n\n for (let factorIndex = 0; factorIndex < fedMatchCount; factorIndex++) {\n matchRows.push(options.matchHeight);\n\n if (factorIndex < fedMatchCount - 1) matchRows.push(options.rowGap);\n }\n\n const elementHeight = isFinalRound ? options.finalMatchHeight : options.matchHeight;\n const blockHeight = Math.max(elementHeight, matchFactor * options.matchHeight + (matchFactor - 1) * options.rowGap);\n const currentBlockHeight = matchRows.reduce((total, height) => total + height, 0);\n\n matchRows[matchRows.length - 1] = (matchRows[matchRows.length - 1] ?? 0) + blockHeight - currentBlockHeight;\n\n elementsToCreate.push({\n type: 'match',\n area: `m${match.shortId}`,\n partHeights: matchRows,\n elementHeight,\n component: isFinalRound ? config.components.finalMatch : config.components.match,\n match,\n round,\n roundSwissGroup: null,\n });\n\n if (!isLastMatch) {\n elementsToCreate.push({\n type: 'matchGap',\n area: '.',\n partHeights: [options.rowGap],\n elementHeight: options.rowGap,\n });\n }\n }\n\n if (config.bottomPadding) {\n elementsToCreate.push({\n type: 'colGap',\n area: '.',\n partHeights: [config.bottomPadding],\n elementHeight: config.bottomPadding,\n });\n }\n\n // Create all elements at once\n for (const elementData of elementsToCreate) {\n const { element } = createBracketElement(elementData);\n\n pushElement(element);\n }\n\n return subColumn;\n};\n","import { BracketRound } from '../../../linked';\nimport {\n BracketComponents,\n BracketElement,\n BracketMasterColumnSection,\n BracketSubColumn,\n createBracketMasterColumnSection,\n} from '../core';\nimport { CreateBracketGridConfig } from '../types';\nimport { createRoundBracketSubColumnRelativeToFirstRound } from './bracket-sub-column-relative-to-first-round';\n\nexport type CreateFoldedThirdPlaceSectionConfig<TRoundData, TMatchData> = {\n /** The sub column holding the final, which the folded round is placed relative to. */\n finalSubColumn: BracketSubColumn<TRoundData, TMatchData>;\n round: BracketRound<TRoundData, TMatchData>;\n /** How far below the top of the final's card the third place card sits, in px. */\n topOffset: number;\n options: CreateBracketGridConfig;\n components: BracketComponents<TRoundData, TMatchData>;\n};\n\nconst heightOfElement = <TRoundData, TMatchData>(element: BracketElement<TRoundData, TMatchData>) =>\n element.parts.reduce((total, part) => total + part.dimensions.height, 0);\n\n/** Read off the built rows rather than re-derived, so the two stay in step. */\nconst cardGeometry = <TRoundData, TMatchData>(subColumn: BracketSubColumn<TRoundData, TMatchData>) => {\n let height = 0;\n let cardTop: number | null = null;\n\n for (const element of subColumn.elements) {\n const elementHeight = heightOfElement(element);\n\n if (element.type === 'match' && cardTop === null) {\n cardTop = height + (elementHeight - element.dimensions.height) / 2;\n }\n\n height += elementHeight;\n }\n\n return { cardTop: cardTop ?? 0, height };\n};\n\n/**\n * The third place match as a second section of the final's master column: one card the given number of\n * px below the top of the final's, with its own round header above it.\n *\n * @internal\n */\nexport const createFoldedThirdPlaceSection = <TRoundData, TMatchData>(\n config: CreateFoldedThirdPlaceSectionConfig<TRoundData, TMatchData>,\n): BracketMasterColumnSection<TRoundData, TMatchData> => {\n const { options, round } = config;\n const final = cardGeometry(config.finalSubColumn);\n const headerOffset = options.roundHeaderHeight > 0 ? options.roundHeaderHeight + options.roundHeaderGap : 0;\n\n // The section stacks below the final's, so what it has to make up is the offset less the room the\n // final's own section already takes. Negative when the fold lands inside that room, which is the\n // ordinary case: the final's block owns the rows of every round feeding it, so it is far taller\n // than its card.\n const paddingTop = final.cardTop + config.topOffset - final.height - headerOffset;\n\n const { masterColumnSection, pushSubColumn } = createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'round',\n padding: { top: paddingTop, bottom: 0, left: 0, right: 0 },\n });\n\n pushSubColumn(\n createRoundBracketSubColumnRelativeToFirstRound({\n firstRound: round,\n round,\n options,\n hasReverseFinal: false,\n // Placed by its offset, so it owns one row rather than the block a squeezed round would give it.\n matchFactor: 1,\n span: { isStart: true, isEnd: true },\n components: config.components,\n }),\n );\n\n return masterColumnSection;\n};\n","import {\n BracketElementToCreate,\n BracketMasterColumn,\n createBracketElement,\n createBracketMasterColumn,\n createBracketMasterColumnSection,\n createBracketSubColumn,\n} from '../core';\nimport { BracketRuntimeError } from '../../../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../../../bracket-errors';\n\nexport type CreateBracketGapMasterColumnConfig<TRoundData, TMatchData> = {\n existingMasterColumns: ReadonlyArray<BracketMasterColumn<TRoundData, TMatchData>>;\n columnGap: number;\n};\n\nexport const createBracketGapMasterColumn = <TRoundData, TMatchData>(\n config: CreateBracketGapMasterColumnConfig<TRoundData, TMatchData>,\n) => {\n const { existingMasterColumns, columnGap } = config;\n\n const lastMasterColumn = existingMasterColumns[existingMasterColumns.length - 1];\n\n if (!lastMasterColumn) {\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.GRID_INVALID,\n 'No last master column found in existing master columns',\n );\n }\n\n const { masterColumn, pushSection } = createBracketMasterColumn<TRoundData, TMatchData>({\n columnWidth: columnGap,\n padding: {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n },\n });\n\n for (const section of lastMasterColumn.sections) {\n const { masterColumnSection, pushSubColumn } = createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'gap',\n });\n\n const lastSubColumn = section.subColumns[section.subColumns.length - 1];\n\n if (!lastSubColumn) {\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.GRID_INVALID, 'No last sub column found in section');\n }\n\n const { pushElement, subColumn } = createBracketSubColumn<TRoundData, TMatchData>({\n span: {\n isStart: lastSubColumn.span.isEnd ? true : false,\n isEnd: lastSubColumn.span.isEnd ? true : false,\n },\n });\n\n for (const lastSubColumnElement of lastSubColumn.elements) {\n const partHeights = lastSubColumnElement.parts.map((part) => part.dimensions.height);\n\n const elementToCreate: BracketElementToCreate<TRoundData, TMatchData> = (() => {\n switch (lastSubColumnElement.type) {\n case 'matchGap':\n case 'roundHeaderGap':\n case 'roundGap':\n case 'colGap': {\n return {\n area: !lastSubColumn.span.isEnd ? lastSubColumnElement.area : `.`,\n type: !lastSubColumn.span.isEnd ? lastSubColumnElement.type : 'colGap',\n elementHeight: lastSubColumnElement.dimensions.height,\n partHeights,\n };\n }\n case 'header':\n if (lastSubColumn.span.isEnd) break;\n\n return {\n area: lastSubColumnElement.area,\n type: lastSubColumnElement.type,\n elementHeight: lastSubColumnElement.dimensions.height,\n partHeights,\n component: lastSubColumnElement.component,\n round: lastSubColumnElement.round,\n roundSwissGroup: lastSubColumnElement.roundSwissGroup,\n };\n\n case 'match':\n if (lastSubColumn.span.isEnd) break;\n\n return {\n area: lastSubColumnElement.area,\n type: lastSubColumnElement.type,\n elementHeight: lastSubColumnElement.dimensions.height,\n partHeights,\n component: lastSubColumnElement.component,\n round: lastSubColumnElement.round,\n match: lastSubColumnElement.match,\n roundSwissGroup: lastSubColumnElement.roundSwissGroup,\n };\n }\n\n return {\n area: `.`,\n type: 'colGap',\n elementHeight: lastSubColumnElement.dimensions.height,\n partHeights,\n };\n })();\n\n pushElement(createBracketElement<TRoundData, TMatchData>(elementToCreate).element);\n }\n\n pushSubColumn(subColumn);\n\n pushSection(masterColumnSection);\n }\n\n return masterColumn;\n};\n","import { Bracket } from '../../linked';\nimport { CreateBracketGridConfig } from './types';\n\nexport const resolveBracketGridRowSpan = <TRoundData, TMatchData>(\n bracket: Bracket<TRoundData, TMatchData>,\n options: CreateBracketGridConfig,\n) => {\n if (!options.rowSpanRoundId) return options;\n\n const round = Array.from(bracket.rounds.values()).find(\n (candidate) =>\n candidate.id === options.rowSpanRoundId || candidate.id.startsWith(`${options.rowSpanRoundId}--half-`),\n );\n\n return round ? { ...options, rowSpanMatchCount: round.matchCount } : options;\n};\n","import { COMMON_BRACKET_ROUND_TYPE, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE } from '../../core';\nimport { Bracket, BracketRound } from '../../linked';\nimport {\n BracketComponents,\n BracketSubColumnSpan,\n createBracketElement,\n createBracketGrid,\n createBracketMasterColumn,\n createBracketMasterColumnSection,\n createBracketSubColumn,\n finalizeBracketGrid,\n} from './core';\nimport {\n calculateColumnSplitFactor,\n calculateLowerRoundIndex,\n calculateUpperLowerRatio,\n calculateUpperRoundIndex,\n} from './double-elimination-utils';\nimport {\n createBracketContinueMasterColumn,\n createBracketGapMasterColumn,\n createRoundBracketSubColumnRelativeToFirstRound,\n getBracketContinueMatches,\n} from './prebuild';\nimport { ComputedBracketGrid, CreateBracketGridConfig } from './types';\nimport { resolveBracketGridRowSpan } from './row-span';\nimport { BracketRuntimeError } from '../../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../../bracket-errors';\n\nexport const createDoubleEliminationGrid = <TRoundData, TMatchData>(\n bracketData: Bracket<TRoundData, TMatchData>,\n options: CreateBracketGridConfig,\n components: BracketComponents<TRoundData, TMatchData>,\n // eslint-disable-next-line max-params -- grid builder signature (data, options, components)\n): ComputedBracketGrid<TRoundData, TMatchData> => {\n const resolvedOptions = resolveBracketGridRowSpan(bracketData, options);\n const grid = createBracketGrid<TRoundData, TMatchData>({ spanElementWidth: resolvedOptions.columnWidth });\n\n const presentUpperBracketRounds = Array.from(\n bracketData.roundsByType.getOrThrow(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET).values(),\n );\n const lowerBracketRounds = Array.from(\n bracketData.roundsByType.getOrThrow(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET).values(),\n );\n\n // A complete winner bracket has (lowerRounds / 2) + 1 rounds. If fewer are present, the winner\n // bracket starts later than round 1 - e.g. a small double elimination where lower-round 1 is\n // seeded directly from a group phase and has no winner round feeding it. Pad the front of the\n // winner rounds with nulls so the column mapping keeps treating the winner bracket as complete:\n // the missing early rounds become empty slots above the lower rounds they never fed, and every\n // present winner round lines up above its real drop-in lower round.\n const fullUpperRoundCount = Math.floor(lowerBracketRounds.length / 2) + 1;\n const frontMissingUpperRounds = Math.max(0, fullUpperRoundCount - presentUpperBracketRounds.length);\n const upperBracketRounds: (BracketRound<TRoundData, TMatchData> | null)[] = [\n ...Array.from({ length: frontMissingUpperRounds }, () => null),\n ...presentUpperBracketRounds,\n ];\n\n const remainingRounds = Array.from(bracketData.rounds.values()).filter(\n (r) =>\n r.type !== DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET &&\n r.type !== DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET &&\n r.type !== COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE,\n );\n\n const thirdPlaceRound = bracketData.roundsByType.get(COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE)?.first() ?? null;\n const hasReverseFinal = !!bracketData.roundsByType.get(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL)?.first();\n\n const firstUpperRound = presentUpperBracketRounds[0];\n const firstLowerRound = lowerBracketRounds[0];\n\n if (!firstUpperRound || !firstLowerRound) {\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.ROUND_RELATION_INVALID,\n 'No upper or lower rounds found in bracket data',\n );\n }\n\n const upperToLowerRatio = calculateUpperLowerRatio(upperBracketRounds.length, lowerBracketRounds.length);\n const columnSplitFactor = calculateColumnSplitFactor(upperToLowerRatio);\n\n /**\n * The winner-bracket half of one column, or the space it would have taken. A front-truncated winner\n * bracket has leading slots with no round in them; reserving their height keeps the lower rounds below\n * aligned with the winner rounds that do exist.\n */\n const createUpperBracketSubColumn = (config: {\n round: BracketRound<TRoundData, TMatchData> | null;\n span: BracketSubColumnSpan;\n }) => {\n if (config.round) {\n return createRoundBracketSubColumnRelativeToFirstRound({\n firstRound: firstUpperRound,\n round: config.round,\n options: resolvedOptions,\n hasReverseFinal,\n span: config.span,\n components,\n });\n }\n\n const emptyUpperHeight =\n (options.roundHeaderHeight > 0 ? options.roundHeaderHeight + options.roundHeaderGap : 0) +\n firstUpperRound.matchCount * options.matchHeight +\n Math.max(0, firstUpperRound.matchCount - 1) * options.rowGap;\n\n const { subColumn, pushElement } = createBracketSubColumn<TRoundData, TMatchData>({ span: config.span });\n const { element } = createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'colGap',\n elementHeight: emptyUpperHeight,\n partHeights: [emptyUpperHeight],\n });\n\n pushElement(element);\n\n return subColumn;\n };\n\n /** The breathing room between the winner and loser halves of a column. */\n const createUpperLowerGapSubColumn = () => {\n const { subColumn, pushElement } = createBracketSubColumn<TRoundData, TMatchData>({\n span: { isStart: true, isEnd: true },\n });\n const { element } = createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'roundGap',\n elementHeight: options.rowRoundGap,\n partHeights: [options.rowRoundGap],\n });\n\n pushElement(element);\n\n return subColumn;\n };\n\n let lastRoundLastSubColumnUpperIndex = -1;\n let lastRoundLastSubColumnLowerIndex = -1;\n\n for (const [lowerRoundIndex, lowerRound] of lowerBracketRounds.entries()) {\n const isLastLowerRound = lowerRoundIndex === lowerBracketRounds.length - 1;\n\n const { masterColumn, pushSection } = createBracketMasterColumn<TRoundData, TMatchData>({\n columnWidth: options.columnWidth,\n padding: {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n },\n });\n\n const { masterColumnSection: upperSection, pushSubColumn: pushUpperSubColumn } = createBracketMasterColumnSection<\n TRoundData,\n TMatchData\n >({\n type: 'round',\n });\n\n const { masterColumnSection: upperLowerGapSection, pushSubColumn: pushUpperLowerSubColumn } =\n createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'gap',\n });\n\n const { masterColumnSection: lowerSection, pushSubColumn: pushLowerSubColumn } = createBracketMasterColumnSection<\n TRoundData,\n TMatchData\n >({\n type: 'round',\n });\n\n for (let currentColumnSplitFactor = 1; currentColumnSplitFactor <= columnSplitFactor; currentColumnSplitFactor++) {\n const subColumnIndex = lowerRoundIndex * columnSplitFactor + (currentColumnSplitFactor - 1);\n\n const currentUpperRoundIndex = calculateUpperRoundIndex(subColumnIndex, upperToLowerRatio, columnSplitFactor);\n const currentLowerRoundIndex = lowerRoundIndex;\n\n const isFirstSubColumnInMasterColumn = currentColumnSplitFactor === 1;\n const isLastSubColumnInMasterColumn = currentColumnSplitFactor === columnSplitFactor;\n\n const previousSubColumnIndex = subColumnIndex - 1;\n const nextSubColumnIndex = subColumnIndex + 1;\n\n const previousUpperRoundIndex =\n previousSubColumnIndex >= 0\n ? calculateUpperRoundIndex(previousSubColumnIndex, upperToLowerRatio, columnSplitFactor)\n : -1;\n const nextUpperRoundIndex = calculateUpperRoundIndex(nextSubColumnIndex, upperToLowerRatio, columnSplitFactor);\n\n const previousLowerRoundIndex =\n previousSubColumnIndex >= 0 ? calculateLowerRoundIndex(previousSubColumnIndex, columnSplitFactor) : -1;\n const nextLowerRoundIndex = calculateLowerRoundIndex(nextSubColumnIndex, columnSplitFactor);\n\n if (currentUpperRoundIndex < 0 || currentUpperRoundIndex >= upperBracketRounds.length) {\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.GRID_INVALID,\n 'Upper round not found for subColumnIndex: ' + subColumnIndex,\n );\n }\n\n // May be null for a leading winner slot that does not exist (front-truncated winner bracket).\n const upperRound = upperBracketRounds[currentUpperRoundIndex];\n\n // For upper bracket spans - check if this round is different from the previous occurrence\n const isUpperSpanStart = isFirstSubColumnInMasterColumn\n ? lowerRoundIndex === 0 || lastRoundLastSubColumnUpperIndex !== currentUpperRoundIndex\n : previousUpperRoundIndex !== currentUpperRoundIndex;\n\n // For upper bracket spans - check if this round will be different in the next occurrence\n const isUpperSpanEnd = isLastSubColumnInMasterColumn\n ? isLastLowerRound ||\n calculateUpperRoundIndex((lowerRoundIndex + 1) * columnSplitFactor, upperToLowerRatio, columnSplitFactor) !==\n currentUpperRoundIndex\n : nextUpperRoundIndex !== currentUpperRoundIndex;\n\n // For lower bracket spans - similar logic\n const isLowerSpanStart = isFirstSubColumnInMasterColumn\n ? lowerRoundIndex === 0 || lastRoundLastSubColumnLowerIndex !== currentLowerRoundIndex\n : previousLowerRoundIndex !== currentLowerRoundIndex;\n\n const isLowerSpanEnd = isLastSubColumnInMasterColumn\n ? isLastLowerRound ||\n calculateLowerRoundIndex((lowerRoundIndex + 1) * columnSplitFactor, columnSplitFactor) !==\n currentLowerRoundIndex\n : nextLowerRoundIndex !== currentLowerRoundIndex;\n\n const upperSpan = { isStart: isUpperSpanStart, isEnd: isUpperSpanEnd };\n\n pushUpperSubColumn(createUpperBracketSubColumn({ round: upperRound ?? null, span: upperSpan }));\n pushUpperLowerSubColumn(createUpperLowerGapSubColumn());\n\n const lowerSubColumn = createRoundBracketSubColumnRelativeToFirstRound({\n firstRound: firstLowerRound,\n round: lowerRound,\n options: resolvedOptions,\n hasReverseFinal,\n span: {\n isStart: isLowerSpanStart,\n isEnd: isLowerSpanEnd,\n },\n components,\n });\n\n pushLowerSubColumn(lowerSubColumn);\n\n if (isLastSubColumnInMasterColumn) {\n lastRoundLastSubColumnUpperIndex = currentUpperRoundIndex;\n lastRoundLastSubColumnLowerIndex = currentLowerRoundIndex;\n }\n }\n\n pushSection(upperSection, upperLowerGapSection, lowerSection);\n\n grid.pushMasterColumn(masterColumn);\n\n // Always separate consecutive lower rounds with a gap column. The trailing gap after the\n // last lower round is only needed to connect to the finals section (remainingRounds); in a\n // truncated bracket without a final we must still gap the intermediate rounds, otherwise the\n // rounds sit flush against each other and their connector lines collapse to zero width.\n if (!isLastLowerRound || remainingRounds.length) {\n grid.pushMasterColumn(\n createBracketGapMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnGap: options.columnGap,\n }),\n );\n }\n }\n\n for (const [roundIndex, round] of remainingRounds.entries()) {\n const isLastRound = roundIndex === remainingRounds.length - 1;\n const isFirstRound = roundIndex === 0;\n\n const isAnyFinal = hasReverseFinal\n ? round.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL\n : round.type === COMMON_BRACKET_ROUND_TYPE.FINAL;\n\n const { masterColumn, pushSection } = createBracketMasterColumn<TRoundData, TMatchData>({\n columnWidth: isAnyFinal ? options.finalColumnWidth : options.columnWidth,\n padding: {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n },\n });\n\n const { masterColumnSection: upperSection, pushSubColumn: pushUpperSubColumn } = createBracketMasterColumnSection<\n TRoundData,\n TMatchData\n >({\n type: 'round',\n });\n\n const { masterColumnSection: upperLowerGapSection, pushSubColumn: pushUpperLowerSubColumn } =\n createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'gap',\n });\n\n const { masterColumnSection: lowerSection, pushSubColumn: pushLowerSubColumn } = createBracketMasterColumnSection<\n TRoundData,\n TMatchData\n >({\n type: 'round',\n });\n\n const upperSubColumn = createRoundBracketSubColumnRelativeToFirstRound({\n firstRound: firstUpperRound,\n round,\n options: resolvedOptions,\n hasReverseFinal,\n span: {\n isStart: true,\n isEnd: true,\n },\n components,\n });\n\n pushUpperSubColumn(upperSubColumn);\n\n const upperLowerGapSubColumn = createBracketSubColumn<TRoundData, TMatchData>({\n span: {\n isStart: true,\n isEnd: true,\n },\n });\n\n const upperLowerGapElement = createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'roundGap',\n elementHeight: options.rowRoundGap,\n partHeights: [options.rowRoundGap],\n });\n\n upperLowerGapSubColumn.pushElement(upperLowerGapElement.element);\n\n pushUpperLowerSubColumn(upperLowerGapSubColumn.subColumn);\n\n if (thirdPlaceRound) {\n const lowerSubColumn = createRoundBracketSubColumnRelativeToFirstRound({\n firstRound: firstLowerRound,\n round: thirdPlaceRound,\n options: resolvedOptions,\n hasReverseFinal,\n span: {\n isStart: isFirstRound,\n isEnd: isLastRound,\n },\n components,\n });\n\n pushLowerSubColumn(lowerSubColumn);\n } else {\n const lowerSubColumn = createBracketSubColumn<TRoundData, TMatchData>({\n span: {\n isStart: true,\n isEnd: true,\n },\n });\n\n const firstMasterRound = grid.grid.masterColumns[0];\n\n if (!firstMasterRound)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.GRID_INVALID, 'No first master round found in grid');\n\n const lastMasterColumnSection = firstMasterRound.sections[firstMasterRound.sections.length - 1];\n\n if (!lastMasterColumnSection)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.GRID_INVALID, 'No last master column section found in grid');\n\n const firstSubColumn = lastMasterColumnSection.subColumns[0];\n\n if (!firstSubColumn)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.GRID_INVALID, 'No first sub column found in grid');\n\n for (const element of firstSubColumn.elements) {\n const el = createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'colGap',\n elementHeight: element.dimensions.height,\n partHeights: element.parts.map((p) => p.dimensions.height),\n });\n\n lowerSubColumn.pushElement(el.element);\n }\n\n pushLowerSubColumn(lowerSubColumn.subColumn);\n }\n\n pushSection(upperSection, upperLowerGapSection, lowerSection);\n\n grid.pushMasterColumn(masterColumn);\n\n if (!isLastRound) {\n grid.pushMasterColumn(\n createBracketGapMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnGap: options.columnGap,\n }),\n );\n }\n }\n\n if (options.continueElement && components.continue) {\n const continueMatches = getBracketContinueMatches(bracketData);\n\n if (continueMatches.length) {\n grid.pushMasterColumn(\n createBracketGapMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnGap: options.columnGap,\n }),\n );\n\n grid.pushMasterColumn(\n createBracketContinueMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnWidth: options.continueElement.columnWidth,\n elementHeight: options.continueElement.elementHeight,\n headerOffset: options.roundHeaderHeight > 0 ? options.roundHeaderHeight + options.roundHeaderGap : 0,\n component: components.continue,\n matches: continueMatches,\n }),\n );\n }\n }\n\n grid.setupElementSpans();\n grid.calculateDimensions();\n\n const finalizedGrid = finalizeBracketGrid(grid);\n\n return {\n raw: grid,\n columns: finalizedGrid.columns,\n matchElementMap: finalizedGrid.elementMap,\n };\n};\n","import {\n BRACKET_ROUND_MIRROR_TYPE,\n BracketRoundType,\n COMMON_BRACKET_ROUND_TYPE,\n DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE,\n} from '../../core';\nimport { Bracket, BracketRound } from '../../linked';\nimport {\n BracketComponents,\n BracketElementToCreate,\n createBracketElement,\n createBracketGrid,\n createBracketMasterColumn,\n createBracketMasterColumnSection,\n createBracketSubColumn,\n finalizeBracketGrid,\n} from './core';\nimport { createBracketGapMasterColumn, createRoundBracketSubColumnRelativeToFirstRound } from './prebuild';\nimport { ComputedBracketGrid, CreateBracketGridConfig } from './types';\nimport { resolveBracketGridRowSpan } from './row-span';\nimport { BracketRuntimeError } from '../../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../../bracket-errors';\n\n/**\n * Where a round that never folded sits in its block's centre chain. A bracket's own rounds go first, by\n * depth; the rounds that decide the tournament follow in the order they are played.\n */\nconst CENTRE_CHAIN_ORDER: Partial<Record<string, number>> = {\n [COMMON_BRACKET_ROUND_TYPE.FINAL]: 1,\n [DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL]: 2,\n [COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE]: 3,\n};\n\n/** One of the two blocks this layout stacks: a bracket folded around its own centre. */\ntype StackedBlock<TRoundData, TMatchData> = {\n /** Every other column's height is derived from this one - the outermost slot on the way out. */\n firstRound: BracketRound<TRoundData, TMatchData>;\n\n /** The slots left of the centre, outermost first. */\n left: BracketRound<TRoundData, TMatchData>[];\n\n /** The slots right of the centre, innermost first. */\n right: BracketRound<TRoundData, TMatchData>[];\n\n /**\n * The centre column, top to bottom: the round both halves converge on, then every round deeper than\n * it. Empty for a block truncated before its two halves meet.\n */\n chain: BracketRound<TRoundData, TMatchData>[];\n\n /** What one ordinary column's matches occupy, headers excluded. */\n content: number;\n\n /** What every ordinary column reserves below its matches so a chain taller than `content` fits. */\n bottomPadding: number;\n\n /** Where the chain starts, so its first round lands on the block's vertical centre. */\n spacerTop: number;\n\n spacerBottom: number;\n};\n\ntype StackedBlockConfig<TRoundData, TMatchData> = {\n rounds: BracketRound<TRoundData, TMatchData>[];\n options: CreateBracketGridConfig;\n hasReverseFinal: boolean;\n};\n\n/** The card drawn for a round's matches - the deciding one is the taller `finalMatch`. */\nconst isFinalMatchRound = <TRoundData, TMatchData>(\n round: BracketRound<TRoundData, TMatchData>,\n hasReverseFinal: boolean,\n) =>\n hasReverseFinal\n ? round.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL\n : round.type === COMMON_BRACKET_ROUND_TYPE.FINAL;\n\n/**\n * A chain round takes exactly the room its cards need. Every other column reserves the same height for\n * every round (`createRoundBracketSubColumnRelativeToFirstRound`), which the chain cannot do - it stacks\n * several rounds in one column.\n */\nconst chainRoundHeight = <TRoundData, TMatchData>(config: {\n round: BracketRound<TRoundData, TMatchData>;\n options: CreateBracketGridConfig;\n hasReverseFinal: boolean;\n}) => {\n const { round, options, hasReverseFinal } = config;\n const cardHeight = isFinalMatchRound(round, hasReverseFinal) ? options.finalMatchHeight : options.matchHeight;\n\n return round.matchCount * cardHeight + Math.max(0, round.matchCount - 1) * options.rowGap;\n};\n\n/**\n * Splits one bracket's rounds into the fold's three parts and works out the heights that keep the two\n * blocks aligned. `null` when the bracket has no rounds at all.\n */\nconst createStackedBlock = <TRoundData, TMatchData>(\n config: StackedBlockConfig<TRoundData, TMatchData>,\n): StackedBlock<TRoundData, TMatchData> | null => {\n const { rounds, options, hasReverseFinal } = config;\n\n const halves = rounds.filter((round) => !!round.mirrorRoundType);\n const left = halves\n .filter((round) => round.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.LEFT)\n .sort((a, b) => a.logicalIndex - b.logicalIndex);\n const right = halves\n .filter((round) => round.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT)\n .sort((a, b) => b.logicalIndex - a.logicalIndex);\n\n const middles = rounds\n .filter((round) => !round.mirrorRoundType)\n .sort(\n (a, b) =>\n (CENTRE_CHAIN_ORDER[a.type] ?? 0) - (CENTRE_CHAIN_ORDER[b.type] ?? 0) || a.logicalIndex - b.logicalIndex,\n );\n\n // Where the two halves meet: one depth past the innermost round that had a second half to fold against.\n const foldDepth = left.length ? Math.max(...left.map((round) => round.logicalIndex)) + 1 : 0;\n\n // An odd early round could not halve, so it has no twin on the way back and keeps a slot of its own on\n // the way out rather than sitting in a middle it is far too wide for.\n const isEarly = (round: BracketRound<TRoundData, TMatchData>) =>\n !CENTRE_CHAIN_ORDER[round.type] && round.logicalIndex < foldDepth;\n\n const leftSlots = [...left, ...middles.filter(isEarly)].sort((a, b) => a.logicalIndex - b.logicalIndex);\n const chain = middles.filter((round) => !isEarly(round));\n\n const firstRound = leftSlots[0] ?? chain[0];\n\n if (!firstRound) return null;\n\n const content = firstRound.matchCount * options.matchHeight + Math.max(0, firstRound.matchCount - 1) * options.rowGap;\n\n let chainHeight = 0;\n\n for (const [index, round] of chain.entries()) {\n chainHeight += (index ? options.rowRoundGap : 0) + chainRoundHeight({ round, options, hasReverseFinal });\n }\n const anchorHeight = chain[0] ? chainRoundHeight({ round: chain[0], options, hasReverseFinal }) : 0;\n\n // The round both halves converge on sits on the block's vertical centre, which is where the two halves'\n // own matches sit - so the connectors into it stay straight. A chain too long to hang under it from\n // there grows the block rather than sliding up: an anchor a few px off centre turns every one of those\n // connectors into a diagonal, in a drawing where nothing else is.\n const spacerTop = Math.max(0, (content - anchorHeight) / 2);\n\n return {\n firstRound,\n left: leftSlots,\n right,\n chain,\n content,\n bottomPadding: Math.max(0, spacerTop + chainHeight - content),\n spacerTop,\n spacerBottom: Math.max(0, content - spacerTop - chainHeight),\n };\n};\n\n/**\n * Draws a double elimination as two mirrored blocks, one above the other: the winners bracket folded\n * around its own centre, the losers bracket folded around its own, and nothing but a gap between them.\n * Each block's deciding rounds hang vertically below the round its two halves converge on.\n *\n * @internal\n */\nexport const createStackedDoubleEliminationGrid = <TRoundData, TMatchData>(\n bracketData: Bracket<TRoundData, TMatchData>,\n options: CreateBracketGridConfig,\n components: BracketComponents<TRoundData, TMatchData>,\n // eslint-disable-next-line max-params -- grid builder signature (data, options, components)\n): ComputedBracketGrid<TRoundData, TMatchData> => {\n const resolvedOptions = resolveBracketGridRowSpan(bracketData, options);\n const grid = createBracketGrid<TRoundData, TMatchData>({ spanElementWidth: resolvedOptions.columnWidth });\n\n const roundsOfType = (type: BracketRoundType) => Array.from(bracketData.roundsByType.get(type)?.values() ?? []);\n\n const hasReverseFinal = !!roundsOfType(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL).length;\n\n const winners = createStackedBlock({\n rounds: [\n ...roundsOfType(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET),\n ...roundsOfType(COMMON_BRACKET_ROUND_TYPE.FINAL),\n ...roundsOfType(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL),\n ],\n options: resolvedOptions,\n hasReverseFinal,\n });\n\n const losers = createStackedBlock({\n rounds: [\n ...roundsOfType(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET),\n ...roundsOfType(COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE),\n ],\n options: resolvedOptions,\n hasReverseFinal,\n });\n\n if (!winners || !losers) {\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.ROUND_RELATION_INVALID,\n 'No upper or lower rounds found in bracket data',\n );\n }\n\n const blocks = [winners, losers];\n const headerBlock = options.roundHeaderHeight > 0 ? options.roundHeaderHeight + options.roundHeaderGap : 0;\n const blockHeight = (block: StackedBlock<TRoundData, TMatchData>) =>\n headerBlock + block.content + block.bottomPadding;\n\n // Both blocks put their centre in the same master column, so the chains - and the grand final's line\n // down to the losers champion - run up one strip rather than two.\n const centreIndex = Math.max(...blocks.map((block) => block.left.length));\n const columnCount = centreIndex + 1 + Math.max(...blocks.map((block) => block.right.length));\n\n /** A column this block does not reach into, holding the height its rounds would have taken. */\n const createPlaceholderSubColumn = (block: StackedBlock<TRoundData, TMatchData>) => {\n const { subColumn, pushElement } = createBracketSubColumn<TRoundData, TMatchData>({\n span: { isStart: true, isEnd: true },\n });\n const height = blockHeight(block);\n\n pushElement(\n createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'colGap',\n elementHeight: height,\n partHeights: [height],\n }).element,\n );\n\n return subColumn;\n };\n\n const createChainSubColumn = (block: StackedBlock<TRoundData, TMatchData>) => {\n const { subColumn, pushElement } = createBracketSubColumn<TRoundData, TMatchData>({\n span: { isStart: true, isEnd: true },\n });\n\n const anchor = block.chain[0];\n\n if (!anchor) return createPlaceholderSubColumn(block);\n\n const elementsToCreate: Array<BracketElementToCreate<TRoundData, TMatchData>> = [];\n\n // One header for the whole chain, naming the round its two halves converge on. The rounds below it\n // are a vertical run of single matches; a header between each would sit on the line joining them.\n if (options.roundHeaderHeight > 0) {\n elementsToCreate.push(\n {\n type: 'header',\n area: `h${anchor.shortId}`,\n partHeights: [options.roundHeaderHeight],\n elementHeight: options.roundHeaderHeight,\n component: components.roundHeader,\n round: anchor,\n roundSwissGroup: null,\n },\n {\n type: 'roundHeaderGap',\n area: '.',\n partHeights: [options.roundHeaderGap],\n elementHeight: options.roundHeaderGap,\n },\n );\n }\n\n if (block.spacerTop > 0) {\n elementsToCreate.push({\n type: 'colGap',\n area: '.',\n partHeights: [block.spacerTop],\n elementHeight: block.spacerTop,\n });\n }\n\n for (const [roundIndex, round] of block.chain.entries()) {\n if (roundIndex) {\n elementsToCreate.push({\n type: 'roundGap',\n area: '.',\n partHeights: [options.rowRoundGap],\n elementHeight: options.rowRoundGap,\n });\n }\n\n const isFinalCard = isFinalMatchRound(round, hasReverseFinal);\n const cardHeight = isFinalCard ? options.finalMatchHeight : options.matchHeight;\n\n for (const [matchIndex, match] of Array.from(round.matches.values()).entries()) {\n if (matchIndex) {\n elementsToCreate.push({\n type: 'matchGap',\n area: '.',\n partHeights: [options.rowGap],\n elementHeight: options.rowGap,\n });\n }\n\n elementsToCreate.push({\n type: 'match',\n area: `m${match.shortId}`,\n partHeights: [cardHeight],\n elementHeight: cardHeight,\n component: isFinalCard ? components.finalMatch : components.match,\n match,\n round,\n roundSwissGroup: null,\n });\n }\n }\n\n if (block.spacerBottom > 0) {\n elementsToCreate.push({\n type: 'colGap',\n area: '.',\n partHeights: [block.spacerBottom],\n elementHeight: block.spacerBottom,\n });\n }\n\n for (const elementData of elementsToCreate) {\n pushElement(createBracketElement<TRoundData, TMatchData>(elementData).element);\n }\n\n return subColumn;\n };\n\n /** What this block draws in the column at `columnIndex`, centred on the shared middle column. */\n const createBlockSubColumn = (block: StackedBlock<TRoundData, TMatchData>, columnIndex: number) => {\n const slotIndex = columnIndex - (centreIndex - block.left.length);\n\n if (slotIndex === block.left.length) return createChainSubColumn(block);\n\n const round =\n slotIndex >= 0 && slotIndex < block.left.length\n ? block.left[slotIndex]\n : block.right[slotIndex - block.left.length - 1];\n\n if (!round) return createPlaceholderSubColumn(block);\n\n return createRoundBracketSubColumnRelativeToFirstRound({\n firstRound: block.firstRound,\n round,\n options: resolvedOptions,\n hasReverseFinal,\n bottomPadding: block.bottomPadding,\n span: { isStart: true, isEnd: true },\n components,\n });\n };\n\n /** The band the print reference leaves empty: the two blocks are independent, so nothing crosses it. */\n const createBandSubColumn = () => {\n const { subColumn, pushElement } = createBracketSubColumn<TRoundData, TMatchData>({\n span: { isStart: true, isEnd: true },\n });\n\n pushElement(\n createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'roundGap',\n elementHeight: options.rowRoundGap,\n partHeights: [options.rowRoundGap],\n }).element,\n );\n\n return subColumn;\n };\n\n for (let columnIndex = 0; columnIndex < columnCount; columnIndex++) {\n const { masterColumn, pushSection } = createBracketMasterColumn<TRoundData, TMatchData>({\n columnWidth: columnIndex === centreIndex ? options.finalColumnWidth : options.columnWidth,\n padding: { bottom: 0, left: 0, right: 0, top: 0 },\n });\n\n const winnersSection = createBracketMasterColumnSection<TRoundData, TMatchData>({ type: 'round' });\n const bandSection = createBracketMasterColumnSection<TRoundData, TMatchData>({ type: 'gap' });\n const losersSection = createBracketMasterColumnSection<TRoundData, TMatchData>({ type: 'round' });\n\n winnersSection.pushSubColumn(createBlockSubColumn(winners, columnIndex));\n bandSection.pushSubColumn(createBandSubColumn());\n losersSection.pushSubColumn(createBlockSubColumn(losers, columnIndex));\n\n pushSection(winnersSection.masterColumnSection, bandSection.masterColumnSection, losersSection.masterColumnSection);\n\n grid.pushMasterColumn(masterColumn);\n\n if (columnIndex < columnCount - 1) {\n grid.pushMasterColumn(\n createBracketGapMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnGap: options.columnGap,\n }),\n );\n }\n }\n\n // No spans: a stacked block draws one round per column, so nothing reaches across its neighbours.\n grid.calculateDimensions();\n\n const finalizedGrid = finalizeBracketGrid(grid);\n\n return {\n raw: grid,\n columns: finalizedGrid.columns,\n matchElementMap: finalizedGrid.elementMap,\n };\n};\n","import { COMMON_BRACKET_ROUND_TYPE } from '../../core';\nimport { Bracket, BracketRound } from '../../linked';\nimport {\n BracketComponents,\n BracketSubColumn,\n createBracketGrid,\n createBracketMasterColumn,\n createBracketMasterColumnSection,\n BracketMasterColumnSection,\n finalizeBracketGrid,\n} from './core';\nimport {\n createBracketContinueMasterColumn,\n createBracketGapMasterColumn,\n createFoldedThirdPlaceSection,\n createRoundBracketSubColumnRelativeToFirstRound,\n getBracketContinueMatches,\n} from './prebuild';\nimport { ComputedBracketGrid, CreateBracketGridConfig } from './types';\nimport { resolveBracketGridRowSpan } from './row-span';\nimport { BracketRuntimeError } from '../../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../../bracket-errors';\n\nconst resolveFoldedThirdPlaceRound = <TRoundData, TMatchData>(\n rounds: BracketRound<TRoundData, TMatchData>[],\n options: CreateBracketGridConfig,\n) => {\n if (options.thirdPlaceTopOffset === null || options.thirdPlaceTopOffset === undefined) return null;\n if (!rounds.some((round) => round.type === COMMON_BRACKET_ROUND_TYPE.FINAL)) return null;\n\n return rounds.find((round) => round.type === COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE) ?? null;\n};\n\nexport const createSingleEliminationGrid = <TRoundData, TMatchData>(\n bracketData: Bracket<TRoundData, TMatchData>,\n options: CreateBracketGridConfig,\n components: BracketComponents<TRoundData, TMatchData>,\n // eslint-disable-next-line max-params -- grid builder signature (data, options, components)\n): ComputedBracketGrid<TRoundData, TMatchData> => {\n const grid = createBracketGrid<TRoundData, TMatchData>({ spanElementWidth: options.columnWidth });\n const rounds = Array.from(bracketData.rounds.values());\n const firstRound = bracketData.rounds.first();\n\n if (!firstRound) {\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.SOURCE_EMPTY, 'No rounds found in bracket data');\n }\n\n const resolvedOptions = resolveBracketGridRowSpan(bracketData, options);\n const foldedThirdPlaceRound = resolveFoldedThirdPlaceRound(rounds, options);\n const columnRounds = rounds.filter((round) => round !== foldedThirdPlaceRound);\n\n let pushSectionToFinal: ((...sections: BracketMasterColumnSection<TRoundData, TMatchData>[]) => void) | null = null;\n let finalSubColumn: BracketSubColumn<TRoundData, TMatchData> | null = null;\n\n for (const [roundIndex, round] of columnRounds.entries()) {\n const isLastRound = roundIndex === columnRounds.length - 1;\n const isFinalRound = round.type === COMMON_BRACKET_ROUND_TYPE.FINAL;\n const { masterColumn, ...mutableMasterColumn } = createBracketMasterColumn<TRoundData, TMatchData>({\n columnWidth: isFinalRound ? options.finalColumnWidth : options.columnWidth,\n padding: {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n },\n });\n\n const { masterColumnSection, pushSubColumn } = createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'round',\n });\n\n const sub = createRoundBracketSubColumnRelativeToFirstRound({\n firstRound,\n round,\n options: resolvedOptions,\n hasReverseFinal: false,\n span: {\n isStart: true,\n isEnd: true,\n },\n components,\n });\n pushSubColumn(sub);\n\n mutableMasterColumn.pushSection(masterColumnSection);\n\n grid.pushMasterColumn(masterColumn);\n\n if (isFinalRound) {\n pushSectionToFinal = mutableMasterColumn.pushSection;\n finalSubColumn = sub;\n }\n\n if (!isLastRound) {\n grid.pushMasterColumn(\n createBracketGapMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnGap: options.columnGap,\n }),\n );\n }\n }\n\n // After the loop, so the gap column beside the final mirrors the final's section alone: the folded\n // round has nothing to its right to stay aligned with.\n if (foldedThirdPlaceRound && pushSectionToFinal && finalSubColumn) {\n pushSectionToFinal(\n createFoldedThirdPlaceSection({\n finalSubColumn,\n round: foldedThirdPlaceRound,\n topOffset: options.thirdPlaceTopOffset ?? 0,\n options: resolvedOptions,\n components,\n }),\n );\n }\n\n if (options.continueElement && components.continue) {\n const continueMatches = getBracketContinueMatches(bracketData);\n\n if (continueMatches.length) {\n grid.pushMasterColumn(\n createBracketGapMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnGap: options.columnGap,\n }),\n );\n\n grid.pushMasterColumn(\n createBracketContinueMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnWidth: options.continueElement.columnWidth,\n elementHeight: options.continueElement.elementHeight,\n headerOffset: options.roundHeaderHeight > 0 ? options.roundHeaderHeight + options.roundHeaderGap : 0,\n component: components.continue,\n matches: continueMatches,\n }),\n );\n }\n }\n\n grid.calculateDimensions();\n\n const finalizedGrid = finalizeBracketGrid(grid);\n\n return {\n raw: grid,\n columns: finalizedGrid.columns,\n matchElementMap: finalizedGrid.elementMap,\n };\n};\n","import { BracketMatchId, BracketMatchPosition, BracketRoundId } from '../core';\nimport { BracketMatchSource } from '../integrations';\nimport { Bracket, BracketMatch, BracketRound } from './bracket';\nimport { BracketRoundRelation } from './round-relations';\nimport { BracketRuntimeError } from '../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../bracket-errors';\n\nconst FALLBACK_MATCH_RELATION_POSITION = -1 as BracketMatchPosition;\n\n// Will usually be 0.5, 1 or 2. In Swiss this value will be gibberish\nexport type BracketMatchFactor = number;\n\n// One match has one previous match and one next match (this would be the case, if a group tournament is being displayed via a bracket)\nexport type BracketMatchRelationOneToOne<TRoundData, TMatchData> = {\n type: 'one-to-one';\n currentMatch: BracketMatch<TRoundData, TMatchData>;\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousMatch: BracketMatch<TRoundData, TMatchData>;\n previousRound: BracketRound<TRoundData, TMatchData>;\n nextMatch: BracketMatch<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n};\n\n// The match has no previous match but a single next match (eg. the start of the bracket)\nexport type BracketMatchRelationNothingToOne<TRoundData, TMatchData> = {\n type: 'nothing-to-one';\n currentMatch: BracketMatch<TRoundData, TMatchData>;\n currentRound: BracketRound<TRoundData, TMatchData>;\n nextMatch: BracketMatch<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n};\n\n// The match has no next match but a single previous match (eg. reverse finals)\nexport type BracketMatchRelationOneToNothing<TRoundData, TMatchData> = {\n type: 'one-to-nothing';\n currentMatch: BracketMatch<TRoundData, TMatchData>;\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousMatch: BracketMatch<TRoundData, TMatchData>;\n previousRound: BracketRound<TRoundData, TMatchData>;\n};\n\n// The match has two previous matches and one next match (eg. a normal match in the bracket that is neither the start nor the end)\nexport type BracketMatchRelationTwoToOne<TRoundData, TMatchData> = {\n type: 'two-to-one';\n currentMatch: BracketMatch<TRoundData, TMatchData>;\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousUpperMatch: BracketMatch<TRoundData, TMatchData>;\n previousUpperRound: BracketRound<TRoundData, TMatchData>;\n previousLowerMatch: BracketMatch<TRoundData, TMatchData>;\n previousLowerRound: BracketRound<TRoundData, TMatchData>;\n nextMatch: BracketMatch<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n};\n\n// The match has two previous matches and no next match (eg. the finals in a single elimination bracket)\nexport type BracketMatchRelationTwoToNothing<TRoundData, TMatchData> = {\n type: 'two-to-nothing';\n currentMatch: BracketMatch<TRoundData, TMatchData>;\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousUpperMatch: BracketMatch<TRoundData, TMatchData>;\n previousUpperRound: BracketRound<TRoundData, TMatchData>;\n previousLowerMatch: BracketMatch<TRoundData, TMatchData>;\n previousLowerRound: BracketRound<TRoundData, TMatchData>;\n};\n\nexport type BracketMatchRelation<TRoundData, TMatchData> =\n | BracketMatchRelationOneToOne<TRoundData, TMatchData>\n | BracketMatchRelationTwoToOne<TRoundData, TMatchData>\n | BracketMatchRelationNothingToOne<TRoundData, TMatchData>\n | BracketMatchRelationOneToNothing<TRoundData, TMatchData>\n | BracketMatchRelationTwoToNothing<TRoundData, TMatchData>;\n\nexport type MatchPositionMaps<TRoundData, TMatchData> = Map<\n BracketRoundId,\n Map<BracketMatchPosition, BracketMatch<TRoundData, TMatchData>>\n>;\n\nexport const generateMatchPosition = (\n match: BracketMatch<unknown, unknown>,\n factor: BracketMatchFactor,\n): BracketMatchPosition => Math.ceil(match.position * factor) as BracketMatchPosition;\n\nexport const generateMatchRelationPositions = <TRoundData, TMatchData>(\n relation: BracketRoundRelation<TRoundData, TMatchData>,\n match: BracketMatch<TRoundData, TMatchData>,\n) => {\n switch (relation.type) {\n case 'nothing-to-one':\n return {\n nextRoundMatchPosition: generateMatchPosition(match, relation.nextRoundMatchFactor),\n previousUpperRoundMatchPosition: FALLBACK_MATCH_RELATION_POSITION,\n previousLowerRoundMatchPosition: FALLBACK_MATCH_RELATION_POSITION,\n };\n\n case 'one-to-nothing': {\n const double = relation.previousRoundMatchFactor === 2 ? 1 : 0;\n return {\n nextRoundMatchPosition: FALLBACK_MATCH_RELATION_POSITION,\n previousUpperRoundMatchPosition: (generateMatchPosition(match, relation.previousRoundMatchFactor) -\n double) as BracketMatchPosition,\n previousLowerRoundMatchPosition: generateMatchPosition(match, relation.previousRoundMatchFactor),\n };\n }\n\n case 'one-to-one': {\n const double = relation.previousRoundMatchFactor === 2 ? 1 : 0;\n return {\n nextRoundMatchPosition: generateMatchPosition(match, relation.nextRoundMatchFactor),\n previousUpperRoundMatchPosition: (generateMatchPosition(match, relation.previousRoundMatchFactor) -\n double) as BracketMatchPosition,\n previousLowerRoundMatchPosition: generateMatchPosition(match, relation.previousRoundMatchFactor),\n };\n }\n\n case 'two-to-one':\n return {\n nextRoundMatchPosition: generateMatchPosition(match, relation.nextRoundMatchFactor),\n previousUpperRoundMatchPosition: generateMatchPosition(match, relation.previousUpperRoundMatchFactor),\n previousLowerRoundMatchPosition: generateMatchPosition(match, relation.previousLowerRoundMatchFactor),\n };\n\n case 'two-to-nothing':\n return {\n nextRoundMatchPosition: FALLBACK_MATCH_RELATION_POSITION,\n previousUpperRoundMatchPosition: generateMatchPosition(match, relation.previousUpperRoundMatchFactor),\n previousLowerRoundMatchPosition: generateMatchPosition(match, relation.previousLowerRoundMatchFactor),\n };\n }\n};\n\nconst createNothingToOneRelation = <TRoundData, TMatchData>(params: {\n match: BracketMatch<TRoundData, TMatchData>;\n relation: Extract<BracketRoundRelation<TRoundData, TMatchData>, { type: 'nothing-to-one' }>;\n matchPositionMaps: MatchPositionMaps<TRoundData, TMatchData>;\n nextRoundMatchPosition: BracketMatchPosition;\n}): BracketMatchRelationNothingToOne<TRoundData, TMatchData> => {\n const { match, relation, matchPositionMaps, nextRoundMatchPosition } = params;\n\n const nextMatch = matchPositionMaps.get(relation.nextRound.id)?.get(nextRoundMatchPosition);\n\n if (!nextMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Next round match not found');\n\n return {\n type: 'nothing-to-one',\n currentMatch: match,\n currentRound: relation.currentRound,\n nextMatch,\n nextRound: relation.nextRound,\n };\n};\n\nconst createOneToNothingOrTwoToNothingRelation = <TRoundData, TMatchData>(params: {\n match: BracketMatch<TRoundData, TMatchData>;\n relation: Extract<BracketRoundRelation<TRoundData, TMatchData>, { type: 'one-to-nothing' }>;\n matchPositionMaps: MatchPositionMaps<TRoundData, TMatchData>;\n previousUpperRoundMatchPosition: BracketMatchPosition;\n previousLowerRoundMatchPosition: BracketMatchPosition;\n}):\n | BracketMatchRelationOneToNothing<TRoundData, TMatchData>\n | BracketMatchRelationTwoToNothing<TRoundData, TMatchData> => {\n const { match, relation, matchPositionMaps, previousUpperRoundMatchPosition, previousLowerRoundMatchPosition } =\n params;\n\n const previousUpperMatch = matchPositionMaps.get(relation.previousRound.id)?.get(previousUpperRoundMatchPosition);\n const previousLowerMatch = matchPositionMaps.get(relation.previousRound.id)?.get(previousLowerRoundMatchPosition);\n\n if (!previousUpperMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Previous round match not found');\n\n if (previousUpperRoundMatchPosition !== previousLowerRoundMatchPosition) {\n if (!previousLowerMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Previous lower round match not found');\n\n return {\n type: 'two-to-nothing',\n currentMatch: match,\n currentRound: relation.currentRound,\n previousUpperMatch,\n previousUpperRound: relation.previousRound,\n previousLowerMatch,\n previousLowerRound: relation.previousRound,\n };\n } else {\n return {\n type: 'one-to-nothing',\n currentMatch: match,\n currentRound: relation.currentRound,\n previousMatch: previousUpperMatch,\n previousRound: relation.previousRound,\n };\n }\n};\n\nconst createOneToOneOrTwoToOneRelation = <TRoundData, TMatchData>(params: {\n match: BracketMatch<TRoundData, TMatchData>;\n relation: Extract<BracketRoundRelation<TRoundData, TMatchData>, { type: 'one-to-one' }>;\n matchPositionMaps: MatchPositionMaps<TRoundData, TMatchData>;\n nextRoundMatchPosition: BracketMatchPosition;\n previousUpperRoundMatchPosition: BracketMatchPosition;\n previousLowerRoundMatchPosition: BracketMatchPosition;\n}): BracketMatchRelationOneToOne<TRoundData, TMatchData> | BracketMatchRelationTwoToOne<TRoundData, TMatchData> => {\n const {\n match,\n relation,\n matchPositionMaps,\n nextRoundMatchPosition,\n previousUpperRoundMatchPosition,\n previousLowerRoundMatchPosition,\n } = params;\n\n const nextMatch = matchPositionMaps.get(relation.nextRound.id)?.get(nextRoundMatchPosition);\n const previousUpperMatch = matchPositionMaps.get(relation.previousRound.id)?.get(previousUpperRoundMatchPosition);\n const previousLowerMatch = matchPositionMaps.get(relation.previousRound.id)?.get(previousLowerRoundMatchPosition);\n\n if (!nextMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Next round match not found');\n if (!previousUpperMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Previous upper round match not found');\n if (!previousLowerMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Previous lower round match not found');\n\n if (previousUpperRoundMatchPosition === previousLowerRoundMatchPosition) {\n return {\n type: 'one-to-one',\n currentMatch: match,\n currentRound: relation.currentRound,\n previousMatch: previousUpperMatch,\n previousRound: relation.previousRound,\n nextMatch,\n nextRound: relation.nextRound,\n };\n } else {\n return {\n type: 'two-to-one',\n currentMatch: match,\n currentRound: relation.currentRound,\n previousUpperMatch,\n previousUpperRound: relation.previousRound,\n previousLowerMatch,\n previousLowerRound: relation.previousRound,\n nextMatch,\n nextRound: relation.nextRound,\n };\n }\n};\n\nconst createTwoToOneRelation = <TRoundData, TMatchData>(params: {\n match: BracketMatch<TRoundData, TMatchData>;\n relation: Extract<BracketRoundRelation<TRoundData, TMatchData>, { type: 'two-to-one' }>;\n matchPositionMaps: MatchPositionMaps<TRoundData, TMatchData>;\n nextRoundMatchPosition: BracketMatchPosition;\n previousUpperRoundMatchPosition: BracketMatchPosition;\n previousLowerRoundMatchPosition: BracketMatchPosition;\n}): BracketMatchRelationTwoToOne<TRoundData, TMatchData> => {\n const {\n match,\n relation,\n matchPositionMaps,\n nextRoundMatchPosition,\n previousUpperRoundMatchPosition,\n previousLowerRoundMatchPosition,\n } = params;\n\n const nextMatch = matchPositionMaps.get(relation.nextRound.id)?.get(nextRoundMatchPosition);\n const previousUpperMatch = matchPositionMaps\n .get(relation.previousUpperRound.id)\n ?.get(previousUpperRoundMatchPosition);\n const previousLowerMatch = matchPositionMaps\n .get(relation.previousLowerRound.id)\n ?.get(previousLowerRoundMatchPosition);\n\n if (!nextMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Next round match not found');\n if (!previousUpperMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Previous upper round match not found');\n if (!previousLowerMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Previous lower round match not found');\n\n return {\n type: 'two-to-one',\n currentMatch: match,\n currentRound: relation.currentRound,\n previousUpperMatch,\n previousUpperRound: relation.previousUpperRound,\n previousLowerMatch,\n previousLowerRound: relation.previousLowerRound,\n nextMatch,\n nextRound: relation.nextRound,\n };\n};\n\nconst createTwoToNothingRelation = <TRoundData, TMatchData>(params: {\n match: BracketMatch<TRoundData, TMatchData>;\n relation: Extract<BracketRoundRelation<TRoundData, TMatchData>, { type: 'two-to-nothing' }>;\n matchPositionMaps: MatchPositionMaps<TRoundData, TMatchData>;\n previousUpperRoundMatchPosition: BracketMatchPosition;\n previousLowerRoundMatchPosition: BracketMatchPosition;\n}): BracketMatchRelationTwoToNothing<TRoundData, TMatchData> => {\n const { match, relation, matchPositionMaps, previousUpperRoundMatchPosition, previousLowerRoundMatchPosition } =\n params;\n\n const previousUpperMatch = matchPositionMaps\n .get(relation.previousUpperRound.id)\n ?.get(previousUpperRoundMatchPosition);\n const previousLowerMatch = matchPositionMaps\n .get(relation.previousLowerRound.id)\n ?.get(previousLowerRoundMatchPosition);\n\n if (!previousUpperMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Previous upper round match not found');\n if (!previousLowerMatch)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.MATCH_RELATION_INVALID, 'Previous lower round match not found');\n\n return {\n type: 'two-to-nothing',\n currentMatch: match,\n currentRound: relation.currentRound,\n previousUpperMatch,\n previousUpperRound: relation.previousUpperRound,\n previousLowerMatch,\n previousLowerRound: relation.previousLowerRound,\n };\n};\n\nexport const generateMatchRelationsNew = <TRoundData, TMatchData>(\n bracketData: Bracket<TRoundData, TMatchData>,\n options: {\n source?: { matches: BracketMatchSource<TMatchData>[] };\n previousMatchIds?: (match: BracketMatchSource<TMatchData>) => string[];\n } = {},\n): BracketMatchRelation<TRoundData, TMatchData>[] => {\n const sourceMatches = options.source?.matches ?? [];\n const hasDeclaredGraph =\n options.previousMatchIds !== undefined || sourceMatches.some((match) => defaultPreviousMatchIds(match).length > 0);\n\n if (hasDeclaredGraph) {\n return generateDeclaredMatchRelations({\n bracket: bracketData,\n sourceMatches,\n previousMatchIds: options.previousMatchIds ?? defaultPreviousMatchIds,\n });\n }\n\n const matchRelations: BracketMatchRelation<TRoundData, TMatchData>[] = [];\n const matchPositionMaps: MatchPositionMaps<TRoundData, TMatchData> = new Map();\n\n for (const round of bracketData.rounds.values()) {\n const matchMap = new Map([...round.matches.values()].map((m) => [m.position, m]));\n matchPositionMaps.set(round.id, matchMap);\n }\n\n for (const match of bracketData.matches.values()) {\n const relation = match.round.relation;\n\n const positions = generateMatchRelationPositions(relation, match);\n\n // A round without a resolved relation (e.g. a truncated bracket where a round has no\n // successor/predecessor to wire up) keeps the placeholder relation from createBracket.\n // Skip it so the match renders without connector lines instead of crashing the whole bracket.\n if (!positions) continue;\n\n const { nextRoundMatchPosition, previousUpperRoundMatchPosition, previousLowerRoundMatchPosition } = positions;\n\n switch (relation.type) {\n case 'nothing-to-one':\n matchRelations.push(\n createNothingToOneRelation({\n match,\n relation,\n matchPositionMaps,\n nextRoundMatchPosition,\n }),\n );\n break;\n\n case 'one-to-nothing':\n matchRelations.push(\n createOneToNothingOrTwoToNothingRelation({\n match,\n relation,\n matchPositionMaps,\n previousUpperRoundMatchPosition,\n previousLowerRoundMatchPosition,\n }),\n );\n break;\n\n case 'one-to-one':\n matchRelations.push(\n createOneToOneOrTwoToOneRelation({\n match,\n relation,\n matchPositionMaps,\n nextRoundMatchPosition,\n previousUpperRoundMatchPosition,\n previousLowerRoundMatchPosition,\n }),\n );\n break;\n\n case 'two-to-one':\n matchRelations.push(\n createTwoToOneRelation({\n match,\n relation,\n matchPositionMaps,\n nextRoundMatchPosition,\n previousUpperRoundMatchPosition,\n previousLowerRoundMatchPosition,\n }),\n );\n break;\n\n case 'two-to-nothing':\n matchRelations.push(\n createTwoToNothingRelation({\n match,\n relation,\n matchPositionMaps,\n previousUpperRoundMatchPosition,\n previousLowerRoundMatchPosition,\n }),\n );\n break;\n }\n }\n\n return matchRelations;\n};\n\nconst defaultPreviousMatchIds = <TMatchData>(match: BracketMatchSource<TMatchData>): string[] =>\n [match.homeSource, match.awaySource]\n .filter((slot) => slot?.kind === 'match-outcome' && slot.matchId !== null)\n .map((slot) => slot?.matchId as string);\n\nconst generateDeclaredMatchRelations = <TRoundData, TMatchData>(options: {\n bracket: Bracket<TRoundData, TMatchData>;\n sourceMatches: BracketMatchSource<TMatchData>[];\n previousMatchIds: (match: BracketMatchSource<TMatchData>) => string[];\n}): BracketMatchRelation<TRoundData, TMatchData>[] => {\n const { bracket, sourceMatches, previousMatchIds } = options;\n const previousByMatchId = new Map(sourceMatches.map((match) => [match.id, previousMatchIds(match)]));\n const nextByMatchId = new Map<string, string>();\n\n // A match can feed two: a semi final feeds the final with its winner and the third place match with\n // its loser. The winner is where the match leads, so it wins over whatever the source happens to list\n // first - without this, `nextMatch` answers \"where does this winner go\" from array order.\n const winnerConsumerByFeederId = new Map<string, string>();\n\n for (const match of sourceMatches) {\n for (const slot of [match.homeSource, match.awaySource]) {\n if (slot?.kind !== 'match-outcome' || slot.role !== 'winner' || !slot.matchId) continue;\n if (!winnerConsumerByFeederId.has(slot.matchId)) winnerConsumerByFeederId.set(slot.matchId, match.id);\n }\n }\n\n for (const [matchId, feederIds] of previousByMatchId) {\n for (const feederId of feederIds) {\n if (winnerConsumerByFeederId.get(feederId) === matchId) nextByMatchId.set(feederId, matchId);\n else if (!nextByMatchId.has(feederId)) nextByMatchId.set(feederId, matchId);\n }\n }\n\n const relations: BracketMatchRelation<TRoundData, TMatchData>[] = [];\n\n for (const match of bracket.matches.values()) {\n const previousMatches = (previousByMatchId.get(match.id) ?? [])\n .map((id) => bracket.matches.get(id as BracketMatchId))\n .filter((candidate): candidate is BracketMatch<TRoundData, TMatchData> => candidate !== undefined);\n const nextMatchId = nextByMatchId.get(match.id);\n const nextMatch = nextMatchId ? bracket.matches.get(nextMatchId as BracketMatchId) : undefined;\n\n if (previousMatches.length === 0 && nextMatch) {\n relations.push({\n type: 'nothing-to-one',\n currentMatch: match,\n currentRound: match.round,\n nextMatch,\n nextRound: nextMatch.round,\n });\n } else if (previousMatches.length === 1 && nextMatch) {\n const previousMatch = previousMatches[0];\n\n if (!previousMatch) continue;\n\n relations.push({\n type: 'one-to-one',\n currentMatch: match,\n currentRound: match.round,\n previousMatch,\n previousRound: previousMatch.round,\n nextMatch,\n nextRound: nextMatch.round,\n });\n } else if (previousMatches.length >= 2 && nextMatch) {\n const previousUpperMatch = previousMatches[0];\n const previousLowerMatch = previousMatches[1];\n\n if (!previousUpperMatch || !previousLowerMatch) continue;\n\n relations.push({\n type: 'two-to-one',\n currentMatch: match,\n currentRound: match.round,\n previousUpperMatch,\n previousUpperRound: previousUpperMatch.round,\n previousLowerMatch,\n previousLowerRound: previousLowerMatch.round,\n nextMatch,\n nextRound: nextMatch.round,\n });\n } else if (previousMatches.length === 1) {\n const previousMatch = previousMatches[0];\n\n if (!previousMatch) continue;\n\n relations.push({\n type: 'one-to-nothing',\n currentMatch: match,\n currentRound: match.round,\n previousMatch,\n previousRound: previousMatch.round,\n });\n } else if (previousMatches.length >= 2) {\n const previousUpperMatch = previousMatches[0];\n const previousLowerMatch = previousMatches[1];\n\n if (!previousUpperMatch || !previousLowerMatch) continue;\n\n relations.push({\n type: 'two-to-nothing',\n currentMatch: match,\n currentRound: match.round,\n previousUpperMatch,\n previousUpperRound: previousUpperMatch.round,\n previousLowerMatch,\n previousLowerRound: previousLowerMatch.round,\n });\n }\n }\n\n return relations;\n};\n","import { BRACKET_ROUND_MIRROR_TYPE, COMMON_BRACKET_ROUND_TYPE, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE } from '../core';\nimport { Bracket, BracketRound } from './bracket';\nimport { BracketRuntimeError } from '../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../bracket-errors';\n\n// One round has one next round (the first round of the bracket)\nexport type BracketRoundRelationNothingToOne<TRoundData, TMatchData> = {\n type: 'nothing-to-one';\n currentRound: BracketRound<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n nextRoundMatchFactor: number;\n};\n\n// One round has one previous round (eg. the finals round of the bracket in case of a single elimination bracket)\nexport type BracketRoundRelationOneToNothing<TRoundData, TMatchData> = {\n type: 'one-to-nothing';\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousRound: BracketRound<TRoundData, TMatchData>;\n previousRoundMatchFactor: number;\n rootRoundMatchFactor: number;\n};\n\n// One round has one previous round and one next round (eg. a normal round in the bracket that is neither the start nor the end)\nexport type BracketRoundRelationOneToOne<TRoundData, TMatchData> = {\n type: 'one-to-one';\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousRound: BracketRound<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n nextRoundMatchFactor: number;\n previousRoundMatchFactor: number;\n rootRoundMatchFactor: number;\n};\n\n// One round has two previous rounds and one next round (eg. the finals round in a double elimination bracket when the reverse finals is also being played)\nexport type BracketRoundRelationTwoToOne<TRoundData, TMatchData> = {\n type: 'two-to-one';\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousUpperRound: BracketRound<TRoundData, TMatchData>;\n previousLowerRound: BracketRound<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n nextRoundMatchFactor: number;\n previousUpperRoundMatchFactor: number;\n previousLowerRoundMatchFactor: number;\n upperRootRoundMatchFactor: number;\n lowerRootRoundMatchFactor: number;\n};\n\n// One round has two previous rounds and no next round (eg. the finals round in a double elimination bracket when the reverse finals is not being played)\nexport type BracketRoundRelationTwoToNothing<TRoundData, TMatchData> = {\n type: 'two-to-nothing';\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousUpperRound: BracketRound<TRoundData, TMatchData>;\n previousLowerRound: BracketRound<TRoundData, TMatchData>;\n previousUpperRoundMatchFactor: number;\n previousLowerRoundMatchFactor: number;\n upperRootRoundMatchFactor: number;\n lowerRootRoundMatchFactor: number;\n};\n\nexport type BracketRoundRelation<TRoundData, TMatchData> =\n | BracketRoundRelationNothingToOne<TRoundData, TMatchData>\n | BracketRoundRelationOneToNothing<TRoundData, TMatchData>\n | BracketRoundRelationOneToOne<TRoundData, TMatchData>\n | BracketRoundRelationTwoToOne<TRoundData, TMatchData>\n | BracketRoundRelationTwoToNothing<TRoundData, TMatchData>;\n\nconst calculateMatchFactor = <TRoundData, TMatchData>(\n numeratorRound: BracketRound<TRoundData, TMatchData>,\n denominatorRound: BracketRound<TRoundData, TMatchData>,\n) => numeratorRound.matchCount / denominatorRound.matchCount;\n\nconst createNothingToOneRelation = <TRoundData, TMatchData>(params: {\n currentRound: BracketRound<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n}): BracketRoundRelationNothingToOne<TRoundData, TMatchData> => ({\n type: 'nothing-to-one',\n currentRound: params.currentRound,\n nextRound: params.nextRound,\n nextRoundMatchFactor: calculateMatchFactor(params.nextRound, params.currentRound),\n});\n\nconst createOneToNothingRelation = <TRoundData, TMatchData>(params: {\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousRound: BracketRound<TRoundData, TMatchData>;\n rootRound: BracketRound<TRoundData, TMatchData>;\n}): BracketRoundRelationOneToNothing<TRoundData, TMatchData> => ({\n type: 'one-to-nothing',\n currentRound: params.currentRound,\n previousRound: params.previousRound,\n previousRoundMatchFactor: calculateMatchFactor(params.previousRound, params.currentRound),\n rootRoundMatchFactor: calculateMatchFactor(params.rootRound, params.currentRound),\n});\n\nconst createOneToOneRelation = <TRoundData, TMatchData>(params: {\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousRound: BracketRound<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n rootRound: BracketRound<TRoundData, TMatchData>;\n}): BracketRoundRelationOneToOne<TRoundData, TMatchData> => ({\n type: 'one-to-one',\n currentRound: params.currentRound,\n previousRound: params.previousRound,\n nextRound: params.nextRound,\n nextRoundMatchFactor: calculateMatchFactor(params.nextRound, params.currentRound),\n previousRoundMatchFactor: calculateMatchFactor(params.previousRound, params.currentRound),\n rootRoundMatchFactor: calculateMatchFactor(params.rootRound, params.currentRound),\n});\n\nconst createTwoToOneRelation = <TRoundData, TMatchData>(params: {\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousUpperRound: BracketRound<TRoundData, TMatchData>;\n previousLowerRound: BracketRound<TRoundData, TMatchData>;\n nextRound: BracketRound<TRoundData, TMatchData>;\n firstUpperRound: BracketRound<TRoundData, TMatchData>;\n firstLowerRound: BracketRound<TRoundData, TMatchData>;\n}): BracketRoundRelationTwoToOne<TRoundData, TMatchData> => ({\n type: 'two-to-one',\n currentRound: params.currentRound,\n previousUpperRound: params.previousUpperRound,\n previousLowerRound: params.previousLowerRound,\n nextRound: params.nextRound,\n nextRoundMatchFactor: calculateMatchFactor(params.nextRound, params.currentRound),\n previousUpperRoundMatchFactor: calculateMatchFactor(params.previousUpperRound, params.currentRound),\n previousLowerRoundMatchFactor: calculateMatchFactor(params.previousLowerRound, params.currentRound),\n upperRootRoundMatchFactor: calculateMatchFactor(params.firstUpperRound, params.currentRound),\n lowerRootRoundMatchFactor: calculateMatchFactor(params.firstLowerRound, params.currentRound),\n});\n\nconst createTwoToNothingRelation = <TRoundData, TMatchData>(params: {\n currentRound: BracketRound<TRoundData, TMatchData>;\n previousUpperRound: BracketRound<TRoundData, TMatchData>;\n previousLowerRound: BracketRound<TRoundData, TMatchData>;\n firstUpperRound: BracketRound<TRoundData, TMatchData>;\n firstLowerRound: BracketRound<TRoundData, TMatchData>;\n}): BracketRoundRelationTwoToNothing<TRoundData, TMatchData> => ({\n type: 'two-to-nothing',\n currentRound: params.currentRound,\n previousUpperRound: params.previousUpperRound,\n previousLowerRound: params.previousLowerRound,\n previousUpperRoundMatchFactor: calculateMatchFactor(params.previousUpperRound, params.currentRound),\n previousLowerRoundMatchFactor: calculateMatchFactor(params.previousLowerRound, params.currentRound),\n upperRootRoundMatchFactor: calculateMatchFactor(params.firstUpperRound, params.currentRound),\n lowerRootRoundMatchFactor: calculateMatchFactor(params.firstLowerRound, params.currentRound),\n});\n\n/** A round drawn on the way back from the middle of a mirrored bracket. */\nconst isFoldedBackRound = <TRoundData, TMatchData>(round: BracketRound<TRoundData, TMatchData>) =>\n round.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT;\n\n/** One bracket's rounds keyed by depth, with the two sides of a fold kept apart. */\ntype BracketRoundsByDepth<TRoundData, TMatchData> = Map<\n number,\n {\n left: BracketRound<TRoundData, TMatchData> | null;\n right: BracketRound<TRoundData, TMatchData> | null;\n /** The round at this depth that was never folded - the middle of a mirrored bracket. */\n single: BracketRound<TRoundData, TMatchData> | null;\n }\n>;\n\nconst buildRoundsByDepth = <TRoundData, TMatchData>(\n rounds: BracketRound<TRoundData, TMatchData>[],\n): BracketRoundsByDepth<TRoundData, TMatchData> => {\n const byDepth: BracketRoundsByDepth<TRoundData, TMatchData> = new Map();\n\n for (const round of rounds) {\n const slot = byDepth.get(round.logicalIndex) ?? { left: null, right: null, single: null };\n\n if (round.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.LEFT) slot.left = round;\n else if (round.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT) slot.right = round;\n else slot.single = round;\n\n byDepth.set(round.logicalIndex, slot);\n }\n\n return byDepth;\n};\n\n/**\n * The round one depth along on the same side of the fold - or, where the fold has closed because that\n * depth was too small to halve, the whole round sitting in the middle.\n */\nconst roundAtDepth = <TRoundData, TMatchData>(params: {\n byDepth: BracketRoundsByDepth<TRoundData, TMatchData>;\n depth: number;\n side: BracketRound<TRoundData, TMatchData>['mirrorRoundType'];\n}) => {\n const slot = params.byDepth.get(params.depth);\n\n if (!slot) return null;\n\n const sameSide = params.side === BRACKET_ROUND_MIRROR_TYPE.RIGHT ? slot.right : slot.left;\n\n return sameSide ?? slot.single ?? null;\n};\n\nconst getNavigationContext = <TRoundData, TMatchData>(params: {\n upperRounds: BracketRound<TRoundData, TMatchData>[];\n upperRoundsByDepth: BracketRoundsByDepth<TRoundData, TMatchData>;\n currentUpperRoundIndex: number;\n}) => {\n const { upperRounds, upperRoundsByDepth, currentUpperRoundIndex } = params;\n const currentUpperRound = upperRounds[currentUpperRoundIndex];\n\n if (!currentUpperRound)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.ROUND_RELATION_INVALID, 'currentUpperRound is null');\n\n const isLeftToRight =\n !currentUpperRound.mirrorRoundType || currentUpperRound.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.LEFT;\n\n // A folded half follows the fold, not the array. Its neighbours are the rounds one depth away on its\n // own side, because the array puts a right half next to whatever happened to be emitted beside it -\n // in a double elimination that is the grand final rather than the round it actually feeds.\n const isFolded = !!currentUpperRound.mirrorRoundType;\n const side = currentUpperRound.mirrorRoundType;\n const depth = currentUpperRound.logicalIndex;\n\n const relativePrevious = isFolded\n ? roundAtDepth({ byDepth: upperRoundsByDepth, depth: depth - 1, side })\n : upperRounds[currentUpperRoundIndex - 1] || null;\n const relativeNext = isFolded\n ? roundAtDepth({ byDepth: upperRoundsByDepth, depth: depth + 1, side })\n : upperRounds[currentUpperRoundIndex + 1] || null;\n\n // A folded half already resolved its own direction, so the swap that turns array order into flow\n // order for a right-hand round must not be applied twice.\n const previousUpperRound = isFolded || isLeftToRight ? relativePrevious : relativeNext;\n const nextUpperRound = isFolded || isLeftToRight ? relativeNext : relativePrevious;\n\n const isLastUpperRound =\n !nextUpperRound ||\n (nextUpperRound.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT && !currentUpperRound.mirrorRoundType);\n\n const isFinal = currentUpperRound.type === COMMON_BRACKET_ROUND_TYPE.FINAL;\n\n return {\n currentUpperRound,\n previousUpperRound,\n nextUpperRound,\n isLastUpperRound,\n isFinal,\n };\n};\n\nconst handleFinalRound = <TRoundData, TMatchData>(params: {\n relations: BracketRoundRelation<TRoundData, TMatchData>[];\n currentUpperRound: BracketRound<TRoundData, TMatchData>;\n previousUpperRound: BracketRound<TRoundData, TMatchData>;\n nextUpperRound: BracketRound<TRoundData, TMatchData> | null;\n /** The lower bracket as it is played, one round per depth - see `lowerFlow`. */\n lowerRounds: BracketRound<TRoundData, TMatchData>[];\n currentUpperRoundIndex: number;\n firstUpperRound: BracketRound<TRoundData, TMatchData>;\n firstLowerRound: BracketRound<TRoundData, TMatchData>;\n lastLowerRound: BracketRound<TRoundData, TMatchData>;\n}) => {\n const {\n relations,\n currentUpperRound,\n previousUpperRound,\n nextUpperRound,\n lowerRounds,\n firstUpperRound,\n firstLowerRound,\n lastLowerRound,\n } = params;\n\n const finalLowerRound = lastLowerRound;\n const isAsyncBracket = nextUpperRound?.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL;\n\n if (nextUpperRound) {\n relations.push(\n createTwoToOneRelation({\n currentRound: currentUpperRound,\n previousUpperRound,\n previousLowerRound: finalLowerRound,\n nextRound: nextUpperRound,\n firstUpperRound,\n firstLowerRound,\n }),\n );\n } else {\n relations.push(\n createTwoToNothingRelation({\n currentRound: currentUpperRound,\n previousUpperRound,\n previousLowerRound: finalLowerRound,\n firstUpperRound,\n firstLowerRound,\n }),\n );\n }\n\n if (isAsyncBracket) {\n const preFinalLowerRound = lowerRounds[lowerRounds.length - 2];\n const prePreFinalLowerRound = lowerRounds[lowerRounds.length - 3] || null;\n\n if (!preFinalLowerRound)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.ROUND_RELATION_INVALID, 'preFinalLowerRound is null');\n\n relations.push(\n createOneToOneRelation({\n currentRound: finalLowerRound,\n previousRound: preFinalLowerRound,\n nextRound: currentUpperRound,\n rootRound: firstLowerRound,\n }),\n );\n\n if (prePreFinalLowerRound) {\n relations.push(\n createOneToOneRelation({\n currentRound: preFinalLowerRound,\n previousRound: prePreFinalLowerRound,\n nextRound: finalLowerRound,\n rootRound: firstLowerRound,\n }),\n );\n } else {\n relations.push(\n createNothingToOneRelation({\n currentRound: preFinalLowerRound,\n nextRound: finalLowerRound,\n }),\n );\n }\n } else {\n const previousLowerRound = lowerRounds[lowerRounds.length - 2] || null;\n if (!previousLowerRound)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.ROUND_RELATION_INVALID, 'previousLowerRound is null');\n relations.push(\n createOneToOneRelation({\n currentRound: finalLowerRound,\n previousRound: previousLowerRound,\n nextRound: currentUpperRound,\n rootRound: firstLowerRound,\n }),\n );\n }\n};\n\nconst handleFirstRound = <TRoundData, TMatchData>(params: {\n relations: BracketRoundRelation<TRoundData, TMatchData>[];\n currentUpperRound: BracketRound<TRoundData, TMatchData>;\n nextUpperRound: BracketRound<TRoundData, TMatchData>;\n lowerRounds: BracketRound<TRoundData, TMatchData>[];\n currentUpperRoundIndex: number;\n}) => {\n const { relations, currentUpperRound, nextUpperRound, lowerRounds, currentUpperRoundIndex } = params;\n\n relations.push(\n createNothingToOneRelation({\n currentRound: currentUpperRound,\n nextRound: nextUpperRound,\n }),\n );\n\n const currentLowerRound = lowerRounds[currentUpperRoundIndex] || null;\n const nextLowerRound = lowerRounds[currentUpperRoundIndex + 1] || null;\n\n // Pairing \"upper round at index i\" with \"lower round at index i\" only means something while the upper\n // array is the outbound flow. A round on the way back from a fold sits past the finals in that array,\n // so its index would claim a lower round in the middle of the bracket and wire it as an opening round -\n // the loop at the end of `generateRoundRelations` reaches it by depth instead.\n if (currentLowerRound && nextLowerRound && !isFoldedBackRound(currentUpperRound)) {\n relations.push(\n createNothingToOneRelation({\n currentRound: currentLowerRound,\n nextRound: nextLowerRound,\n }),\n );\n }\n};\n\nconst handleRegularRound = <TRoundData, TMatchData>(params: {\n relations: BracketRoundRelation<TRoundData, TMatchData>[];\n currentUpperRound: BracketRound<TRoundData, TMatchData>;\n previousUpperRound: BracketRound<TRoundData, TMatchData>;\n nextUpperRound: BracketRound<TRoundData, TMatchData>;\n lowerRounds: BracketRound<TRoundData, TMatchData>[];\n currentUpperRoundIndex: number;\n firstUpperRound: BracketRound<TRoundData, TMatchData>;\n firstLowerRound: BracketRound<TRoundData, TMatchData> | null;\n}) => {\n const {\n relations,\n currentUpperRound,\n previousUpperRound,\n nextUpperRound,\n lowerRounds,\n currentUpperRoundIndex,\n firstUpperRound,\n firstLowerRound,\n } = params;\n\n relations.push(\n createOneToOneRelation({\n currentRound: currentUpperRound,\n previousRound: previousUpperRound,\n nextRound: nextUpperRound,\n rootRound: firstUpperRound,\n }),\n );\n\n const currentLowerRound = lowerRounds[currentUpperRoundIndex] || null;\n const previousLowerRound = lowerRounds[currentUpperRoundIndex - 1] || null;\n const nextLowerRound = lowerRounds[currentUpperRoundIndex + 1] || null;\n\n if (\n currentLowerRound &&\n currentUpperRound.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET &&\n previousLowerRound &&\n nextLowerRound &&\n firstLowerRound &&\n // See `handleFirstRound`: an index into the outbound flow says nothing about a folded-back round.\n !isFoldedBackRound(currentUpperRound)\n ) {\n relations.push(\n createOneToOneRelation({\n currentRound: currentLowerRound,\n previousRound: previousLowerRound,\n nextRound: nextLowerRound,\n rootRound: firstLowerRound,\n }),\n );\n }\n};\n\nexport const generateRoundRelationsNew = <TRoundData, TMatchData>(\n bracketData: Bracket<TRoundData, TMatchData>,\n): BracketRoundRelation<TRoundData, TMatchData>[] => {\n const relations: BracketRoundRelation<TRoundData, TMatchData>[] = [];\n\n // A relation may never name a round with no matches: every position in it comes from a ratio of match\n // counts, so a zero puts each neighbour's match at a position nothing occupies. A round whose matches\n // are not drawn yet is treated as absent instead, and its neighbours wired to each other.\n const allRounds = [...bracketData.rounds.values()].filter((round) => round.matchCount > 0);\n const upperRounds = allRounds.filter((r) => r.type !== DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET);\n const lowerRounds = allRounds.filter((r) => r.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET);\n\n const upperRoundsByDepth = buildRoundsByDepth(upperRounds);\n const lowerRoundsByDepth = buildRoundsByDepth(lowerRounds);\n\n // The lower bracket as it is *played*: one round per depth, taking the left half of a folded round.\n // A fold draws each early round twice, so the raw array holds two entries per depth and its last\n // element is a first-round half rather than the round that feeds the grand final. Unfolded, this is\n // the array itself.\n const lowerFlow = Array.from(lowerRoundsByDepth.keys())\n .sort((a, b) => a - b)\n .map((depth) => roundAtDepth({ byDepth: lowerRoundsByDepth, depth, side: null }))\n .filter((round) => !!round);\n\n const firstUpperRound = upperRounds[0];\n const firstLowerRound = lowerFlow[0] || null;\n const lastLowerRound = lowerFlow[lowerFlow.length - 1] || null;\n\n // Nothing is drawn yet, so there is nothing to relate - not a malformed structure.\n if (allRounds.length === 0) return relations;\n\n if (!firstUpperRound)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.ROUND_RELATION_INVALID, 'No upper rounds found');\n\n const hasLowerRounds = lowerRounds.length > 0;\n\n for (const [currentUpperRoundIndex] of upperRounds.entries()) {\n const nav = getNavigationContext({\n upperRounds,\n upperRoundsByDepth,\n currentUpperRoundIndex,\n });\n\n if (nav.isFinal && hasLowerRounds && lastLowerRound && firstLowerRound && nav.previousUpperRound) {\n handleFinalRound({\n relations,\n currentUpperRound: nav.currentUpperRound,\n previousUpperRound: nav.previousUpperRound,\n nextUpperRound: nav.nextUpperRound,\n lowerRounds: lowerFlow,\n currentUpperRoundIndex,\n firstUpperRound,\n firstLowerRound,\n lastLowerRound,\n });\n } else if (nav.isLastUpperRound && nav.previousUpperRound) {\n relations.push(\n createOneToNothingRelation({\n currentRound: nav.currentUpperRound,\n previousRound: nav.previousUpperRound,\n rootRound: firstUpperRound,\n }),\n );\n } else if (nav.currentUpperRound.isFirstRound && nav.nextUpperRound) {\n handleFirstRound({\n relations,\n currentUpperRound: nav.currentUpperRound,\n nextUpperRound: nav.nextUpperRound,\n lowerRounds: lowerFlow,\n currentUpperRoundIndex,\n });\n } else if (nav.nextUpperRound && !nav.previousUpperRound) {\n relations.push(\n createNothingToOneRelation({\n currentRound: nav.currentUpperRound,\n nextRound: nav.nextUpperRound,\n }),\n );\n } else if (nav.previousUpperRound && nav.nextUpperRound) {\n handleRegularRound({\n relations,\n currentUpperRound: nav.currentUpperRound,\n previousUpperRound: nav.previousUpperRound,\n nextUpperRound: nav.nextUpperRound,\n lowerRounds: lowerFlow,\n currentUpperRoundIndex,\n firstUpperRound,\n firstLowerRound,\n });\n }\n }\n\n if (hasLowerRounds && firstLowerRound) {\n const assignedRoundIds = new Set(relations.map((r) => r.currentRound.id));\n\n // By depth and side rather than by array position: in a folded bracket the array holds two rounds\n // per depth, so its neighbours are whatever was emitted alongside - for an unfolded one the two are\n // the same thing.\n for (const lowerRound of lowerRounds) {\n if (assignedRoundIds.has(lowerRound.id)) continue;\n\n const side = lowerRound.mirrorRoundType;\n const depth = lowerRound.logicalIndex;\n const prevLowerRound = roundAtDepth({ byDepth: lowerRoundsByDepth, depth: depth - 1, side });\n const nextLowerRound = roundAtDepth({ byDepth: lowerRoundsByDepth, depth: depth + 1, side });\n\n if (nextLowerRound) {\n if (!prevLowerRound) {\n relations.push(createNothingToOneRelation({ currentRound: lowerRound, nextRound: nextLowerRound }));\n } else {\n relations.push(\n createOneToOneRelation({\n currentRound: lowerRound,\n previousRound: prevLowerRound,\n nextRound: nextLowerRound,\n rootRound: firstLowerRound,\n }),\n );\n }\n } else if (prevLowerRound) {\n // Truncated bracket: the last lower round has no final round to feed into, so it terminates here.\n // In a complete bracket this round is wired up by handleFinalRound and already in assignedRoundIds.\n relations.push(\n createOneToNothingRelation({\n currentRound: lowerRound,\n previousRound: prevLowerRound,\n rootRound: firstLowerRound,\n }),\n );\n }\n }\n }\n\n return relations;\n};\n","import {\n BracketMap,\n BracketMatchId,\n BracketRoundId,\n BracketRoundType,\n createBracketBase,\n CreateBracketOptions,\n MatchParticipantId,\n BracketMatchBase,\n BracketMatchParticipantBase,\n BracketParticipantBase,\n BracketRoundBase,\n TournamentMode,\n} from '../core';\nimport { BracketDataSource } from '../integrations';\nimport { BracketMatchRelation, generateMatchRelationsNew } from './match-relations';\nimport { BracketRoundRelation, generateRoundRelationsNew } from './round-relations';\nimport { BracketRuntimeError } from '../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../bracket-errors';\n\nexport type Bracket<TRoundData, TMatchData> = {\n rounds: BracketMap<BracketRoundId, BracketRound<TRoundData, TMatchData>>;\n roundsByType: BracketMap<BracketRoundType, BracketMap<BracketRoundId, BracketRound<TRoundData, TMatchData>>>;\n matches: BracketMap<BracketMatchId, BracketMatch<TRoundData, TMatchData>>;\n participants: BracketMap<MatchParticipantId, BracketParticipant<TRoundData, TMatchData>>;\n mode: TournamentMode;\n};\n\nexport type BracketRound<TRoundData, TMatchData> = BracketRoundBase<TRoundData> & {\n matches: BracketMap<BracketMatchId, BracketMatch<TRoundData, TMatchData>>;\n relation: BracketRoundRelation<TRoundData, TMatchData>;\n};\n\nexport type BracketMatch<TRoundData, TMatchData> = BracketMatchBase<TMatchData> & {\n round: BracketRound<TRoundData, TMatchData>;\n home: BracketMatchParticipant<TRoundData, TMatchData> | null;\n away: BracketMatchParticipant<TRoundData, TMatchData> | null;\n winner: BracketMatchParticipant<TRoundData, TMatchData> | null;\n relation: BracketMatchRelation<TRoundData, TMatchData>;\n};\n\nexport type BracketParticipantMatch<TRoundData, TMatchData> = BracketMatch<TRoundData, TMatchData> & {\n me: BracketMatchParticipant<TRoundData, TMatchData>;\n opponent: BracketMatchParticipant<TRoundData, TMatchData> | null;\n};\n\nexport type BracketParticipant<TRoundData, TMatchData> = BracketParticipantBase & {\n matches: BracketMap<BracketMatchId, BracketParticipantMatch<TRoundData, TMatchData>>;\n};\n\nexport type BracketMatchParticipant<TRoundData, TMatchData> = BracketMatchParticipantBase & {\n matches: BracketMap<BracketMatchId, BracketMatch<TRoundData, TMatchData>>;\n};\n\nexport const createBracket = <TRoundData, TMatchData>(\n source: BracketDataSource<TRoundData, TMatchData>,\n options: CreateBracketOptions<TMatchData>,\n) => {\n if (!source.rounds.length)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.SOURCE_EMPTY, 'The bracket source has no rounds to render');\n\n const bracketNewBase = createBracketBase(source, options);\n\n const rounds = new BracketMap<BracketRoundId, BracketRound<TRoundData, TMatchData>>();\n const roundsByType = new BracketMap<\n BracketRoundType,\n BracketMap<BracketRoundId, BracketRound<TRoundData, TMatchData>>\n >();\n\n for (const roundBase of bracketNewBase.rounds.values()) {\n const newRound: BracketRound<TRoundData, TMatchData> = {\n ...roundBase,\n matches: new BracketMap(),\n relation: { type: 'dummy' } as unknown as BracketRoundRelation<TRoundData, TMatchData>,\n };\n rounds.set(roundBase.id, newRound);\n if (!roundsByType.has(roundBase.type)) {\n roundsByType.set(roundBase.type, new BracketMap());\n }\n roundsByType.getOrThrow(roundBase.type).set(roundBase.id, newRound);\n }\n\n const participants = new BracketMap<MatchParticipantId, BracketParticipant<TRoundData, TMatchData>>();\n\n for (const participantBase of bracketNewBase.participants.values()) {\n participants.set(participantBase.id, {\n ...participantBase,\n matches: new BracketMap(),\n });\n }\n\n const matches = new BracketMap<BracketMatchId, BracketMatch<TRoundData, TMatchData>>();\n\n for (const matchBase of bracketNewBase.matches.values()) {\n const round = rounds.getOrThrow(matchBase.roundId as BracketRoundId);\n\n const homeParticipant = matchBase.home\n ? { ...matchBase.home, matches: new BracketMap<BracketMatchId, BracketMatch<TRoundData, TMatchData>>() }\n : null;\n const awayParticipant = matchBase.away\n ? { ...matchBase.away, matches: new BracketMap<BracketMatchId, BracketMatch<TRoundData, TMatchData>>() }\n : null;\n\n const newMatch: BracketMatch<TRoundData, TMatchData> = {\n ...matchBase,\n home: homeParticipant,\n away: awayParticipant,\n winner: null,\n round,\n relation: { type: 'dummy' } as unknown as BracketMatchRelation<TRoundData, TMatchData>,\n };\n\n if (matchBase.winner) {\n const winnerParticipant = homeParticipant?.id === matchBase.winner.id ? homeParticipant : awayParticipant;\n if (!winnerParticipant)\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.WINNER_NOT_FOUND,\n `Winner participant with id ${matchBase.winner.id} not found in match base`,\n );\n newMatch.winner = winnerParticipant;\n }\n\n matches.set(matchBase.id, newMatch);\n round.matches.set(matchBase.id, newMatch);\n }\n\n const newBracket: Bracket<TRoundData, TMatchData> = {\n matches,\n participants,\n rounds,\n roundsByType,\n mode: bracketNewBase.mode,\n };\n\n const roundRelations = generateRoundRelationsNew(newBracket);\n\n for (const roundRelation of roundRelations) {\n roundRelation.currentRound.relation = roundRelation;\n }\n\n const matchRelations = generateMatchRelationsNew(newBracket, {\n source,\n previousMatchIds: options.previousMatchIds,\n });\n\n for (const matchRelation of matchRelations) {\n matchRelation.currentMatch.relation = matchRelation;\n }\n\n // After the relations, never before: a participant's view of a match is a copy of it, so building it\n // any earlier would freeze the placeholder relation into every copy.\n for (const match of matches.values()) {\n if (match.home) {\n participants.getOrThrow(match.home.id).matches.set(match.id, { ...match, me: match.home, opponent: match.away });\n }\n if (match.away) {\n participants.getOrThrow(match.away.id).matches.set(match.id, { ...match, me: match.away, opponent: match.home });\n }\n }\n\n for (const participant of participants.values()) {\n for (const match of participant.matches.values()) {\n if (match.home?.id === participant.id) match.home.matches = participant.matches;\n if (match.away?.id === participant.id) match.away.matches = participant.matches;\n if (match.winner?.id === participant.id) match.winner.matches = participant.matches;\n }\n }\n\n return newBracket;\n};\n","import { BracketMatchId, MatchParticipantSide } from '../core';\nimport { BracketSlotSource } from '../integrations';\nimport { Bracket, BracketMatch } from './bracket';\n\nexport type BracketPickSet = {\n /** The participant the viewer picked to win a match. */\n matchWinner: (matchId: string) => string | null;\n /** The participant the viewer put on a table position. */\n standingRank: (options: { standingId: string; rank: number }) => string | null;\n};\n\nexport const isBracketSlotPredictable = (source: BracketSlotSource | null): boolean =>\n source?.kind === 'match-outcome' || source?.kind === 'standing-rank' || source?.kind === 'seed';\n\n/** How a resolution weighs a prediction against what is already known. Both parts default to the stricter answer. */\nexport type BracketSlotResolutionPolicy = {\n /**\n * Whether the participant really standing on a slot of the given match outranks whatever the picks\n * predict for it. Must answer from the match alone, and answer the same way throughout one\n * resolution: the walk memoizes per slot.\n *\n * `true` answers with the real participant wherever one is known - the pairing a pick was made\n * against, which is what an open round should show. `false`, the default, answers with the\n * prediction even where reality already disagrees, which is what a locked round should show: the\n * record of the guess.\n */\n realParticipantOutranksPick?: (match: BracketMatch<unknown, unknown>) => boolean;\n\n /**\n * Whether a predicted winner still counts while one side of the match it was made on is unknown.\n * `false`, the default, drops it until both sides resolve. `true` keeps it until both sides are\n * known and it is neither of them - until then nothing contradicts it.\n */\n keepPickWhileFeederSideIsOpen?: boolean;\n};\n\ntype ResolveBracketSlotOptions = BracketSlotResolutionPolicy & {\n bracket: Bracket<unknown, unknown>;\n picks: BracketPickSet;\n matchId: string;\n side: MatchParticipantSide;\n};\n\nconst sourceFor = (match: BracketMatch<unknown, unknown>, side: MatchParticipantSide) =>\n side === 'home' ? match.homeSource : match.awaySource;\n\nconst participantIdFor = (match: BracketMatch<unknown, unknown>, side: MatchParticipantSide) => match[side]?.id ?? null;\n\ntype ResolveWalk = {\n bracket: Bracket<unknown, unknown>;\n picks: BracketPickSet;\n realParticipantOutranksPick: (match: BracketMatch<unknown, unknown>) => boolean;\n keepPickWhileFeederSideIsOpen: boolean;\n visited: Set<string>;\n resolved: Map<string, string | null>;\n cycleHits: number;\n};\n\nconst resolveMatchOutcome = (options: { walk: ResolveWalk; source: BracketSlotSource }): string | null => {\n const { walk, source } = options;\n\n if (!source.matchId || !source.role) return null;\n\n const feeder = walk.bracket.matches.get(source.matchId as BracketMatchId);\n\n if (!feeder) return null;\n\n const homeSource = sourceFor(feeder, 'home');\n const awaySource = sourceFor(feeder, 'away');\n const home = resolveSlot({ walk, match: feeder, side: 'home' });\n const away = resolveSlot({ walk, match: feeder, side: 'away' });\n\n if (homeSource?.kind === 'bye' && awaySource?.kind !== 'bye') {\n return source.role === 'winner' ? away : null;\n }\n\n if (awaySource?.kind === 'bye' && homeSource?.kind !== 'bye') {\n return source.role === 'winner' ? home : null;\n }\n\n if (!home || !away) {\n return walk.keepPickWhileFeederSideIsOpen && source.role === 'winner' ? walk.picks.matchWinner(feeder.id) : null;\n }\n\n const pickedWinner = walk.picks.matchWinner(feeder.id);\n\n if (pickedWinner !== home && pickedWinner !== away) return null;\n\n return source.role === 'winner' ? pickedWinner : pickedWinner === home ? away : home;\n};\n\nconst resolveSource = (options: {\n walk: ResolveWalk;\n match: BracketMatch<unknown, unknown>;\n side: MatchParticipantSide;\n source: BracketSlotSource;\n}): string | null => {\n const { walk, match, side, source } = options;\n\n switch (source.kind) {\n case 'match-outcome':\n return resolveMatchOutcome({ walk, source });\n case 'standing-rank':\n return source.standingId && source.rank !== null\n ? walk.picks.standingRank({ standingId: source.standingId, rank: source.rank })\n : null;\n case 'seed':\n case 'swiss-bucket':\n case 'external':\n return participantIdFor(match, side);\n case 'bye':\n return null;\n }\n};\n\nconst resolveSlotOccupant = (options: {\n walk: ResolveWalk;\n match: BracketMatch<unknown, unknown>;\n side: MatchParticipantSide;\n}): string | null => {\n const { walk, match, side } = options;\n const real = participantIdFor(match, side);\n\n if (real !== null && walk.realParticipantOutranksPick(match)) return real;\n\n const source = sourceFor(match, side);\n\n return source ? resolveSource({ walk, match, side, source }) : real;\n};\n\nconst resolveSlot = (options: {\n walk: ResolveWalk;\n match: BracketMatch<unknown, unknown>;\n side: MatchParticipantSide;\n}): string | null => {\n const { walk, match, side } = options;\n const visitKey = `${match.id}:${side}`;\n\n if (walk.visited.has(visitKey)) {\n walk.cycleHits++;\n\n return null;\n }\n\n const resolved = walk.resolved.get(visitKey);\n\n if (resolved !== undefined) return resolved;\n\n walk.visited.add(visitKey);\n\n const cycleHitsBefore = walk.cycleHits;\n\n try {\n const result = resolveSlotOccupant({ walk, match, side });\n\n // Only a result the visit guard never interfered with is a function of the slot alone. One that\n // did hit the guard depends on the path that reached it, so caching it would answer a later path\n // with a cycle's `null`.\n if (walk.cycleHits === cycleHitsBefore) walk.resolved.set(visitKey, result);\n\n return result;\n } finally {\n walk.visited.delete(visitKey);\n }\n};\n\nconst createResolveWalk = (\n options: BracketSlotResolutionPolicy & { bracket: Bracket<unknown, unknown>; picks: BracketPickSet },\n): ResolveWalk => ({\n bracket: options.bracket,\n picks: options.picks,\n realParticipantOutranksPick: options.realParticipantOutranksPick ?? (() => false),\n keepPickWhileFeederSideIsOpen: options.keepPickWhileFeederSideIsOpen ?? false,\n visited: new Set(),\n resolved: new Map(),\n cycleHits: 0,\n});\n\n/** Who the viewer's own picks put in a slot, or `null` while their picks do not reach it. */\nexport const resolveBracketSlot = (options: ResolveBracketSlotOptions): string | null => {\n const match = options.bracket.matches.get(options.matchId as BracketMatchId);\n\n return match ? resolveSlot({ walk: createResolveWalk(options), match, side: options.side }) : null;\n};\n","import { Bracket, BracketMatch } from './bracket';\nimport { BracketPickSet, BracketSlotResolutionPolicy, resolveBracketSlot } from './resolve-bracket-slot';\n\nexport type BracketPickMigrationOptions = BracketSlotResolutionPolicy & {\n bracket: Bracket<unknown, unknown>;\n /** The participant the viewer picked on a match, on the match they picked it on. */\n pickAsMade: (matchId: string) => string | null;\n /** The participant the viewer put on a table position, for the `standing-rank` slots a round resolves from. */\n standingRank?: (options: { standingId: string; rank: number }) => string | null;\n /** Matches whose picks the backend already keeps. Their picks neither travel out nor take one in. */\n lockedMatchIds?: ReadonlySet<string>;\n};\n\nexport type BracketPickMigration = {\n /** The pick that counts on a match: the one made on it, or the one that followed its participant here. */\n pickByMatchId: Record<string, string | undefined>;\n /** For a match that took a pick in, the match that pick was made on. */\n movedFromByMatchId: Record<string, string | undefined>;\n /** For a match whose pick nothing in its round can honour, that pick. Such a match holds no selection. */\n strandedByMatchId: Record<string, string | undefined>;\n};\n\n// Grouped by type and depth rather than by round id: a mirrored layout splits one round into two\n// half-rounds to draw either side of the fold, and a pick has to be able to travel across it. Ordered\n// topologically over the declared provenance, because a round is settled against the ones feeding it.\nconst roundsOf = (bracket: Bracket<unknown, unknown>): BracketMatch<unknown, unknown>[][] => {\n const matchesByKey = new Map<string, BracketMatch<unknown, unknown>[]>();\n const keyByMatchId = new Map<string, string>();\n\n for (const round of bracket.rounds.values()) {\n const key = `${round.type}:${round.logicalIndex}`;\n const matches = matchesByKey.get(key) ?? [];\n\n for (const match of round.matches.values()) {\n matches.push(match);\n keyByMatchId.set(match.id, key);\n }\n\n matchesByKey.set(key, matches);\n }\n\n const unsettledFeedersByKey = new Map<string, Set<string>>();\n\n for (const [key, matches] of matchesByKey) {\n const feeders = new Set<string>();\n\n for (const match of matches) {\n for (const source of [match.homeSource, match.awaySource]) {\n if (source?.kind !== 'match-outcome' || !source.matchId) continue;\n\n const feederKey = keyByMatchId.get(source.matchId);\n\n if (feederKey !== undefined && feederKey !== key) feeders.add(feederKey);\n }\n }\n\n unsettledFeedersByKey.set(key, feeders);\n }\n\n const ordered: BracketMatch<unknown, unknown>[][] = [];\n\n while (unsettledFeedersByKey.size) {\n const keys = [...unsettledFeedersByKey.keys()];\n // A malformed graph can leave a cycle in which nothing is ready, so fall back to the first\n // round left rather than looping forever.\n const key = keys.find((candidate) => !unsettledFeedersByKey.get(candidate)?.size) ?? keys[0];\n\n if (key === undefined) break;\n\n ordered.push(matchesByKey.get(key) ?? []);\n unsettledFeedersByKey.delete(key);\n\n for (const feeders of unsettledFeedersByKey.values()) feeders.delete(key);\n }\n\n return ordered;\n};\n\n/**\n * Where every pick stands once each one has followed its participant into whichever match of its own\n * round that participant now plays. A pick nothing in the round can honour comes back stranded.\n */\nexport const migrateBracketPicks = (options: BracketPickMigrationOptions): BracketPickMigration => {\n const { bracket, pickAsMade } = options;\n const locked = options.lockedMatchIds ?? new Set<string>();\n const pickByMatchId: Record<string, string | undefined> = {};\n const movedFromByMatchId: Record<string, string | undefined> = {};\n const strandedByMatchId: Record<string, string | undefined> = {};\n\n const settled: BracketPickSet = {\n matchWinner: (matchId) => pickByMatchId[matchId] ?? null,\n standingRank: options.standingRank ?? (() => null),\n };\n\n for (const round of roundsOf(bracket)) {\n const sidesByMatchId = new Map<string, [string | null, string | null]>();\n const travelling: { matchId: string; pick: string }[] = [];\n const strandedHere = new Set<string>();\n const sidesOf = (matchId: string) => sidesByMatchId.get(matchId) ?? [null, null];\n\n for (const match of round) {\n const resolve = (side: 'home' | 'away') =>\n resolveBracketSlot({\n bracket,\n picks: settled,\n matchId: match.id,\n side,\n realParticipantOutranksPick: options.realParticipantOutranksPick,\n keepPickWhileFeederSideIsOpen: options.keepPickWhileFeederSideIsOpen,\n });\n\n sidesByMatchId.set(match.id, [resolve('home'), resolve('away')]);\n }\n\n for (const match of round) {\n const pick = pickAsMade(match.id);\n\n if (!pick) continue;\n\n const [home, away] = sidesOf(match.id);\n\n if (pick === home || pick === away) {\n pickByMatchId[match.id] = pick;\n\n continue;\n }\n\n if (locked.has(match.id)) {\n pickByMatchId[match.id] = pick;\n strandedByMatchId[match.id] = pick;\n\n continue;\n }\n\n travelling.push({ matchId: match.id, pick });\n }\n\n for (const { matchId, pick } of travelling) {\n const target = round.find((candidate) => {\n if (candidate.id === matchId || locked.has(candidate.id) || pickByMatchId[candidate.id]) return false;\n if (strandedHere.has(candidate.id)) return false;\n\n const [home, away] = sidesOf(candidate.id);\n\n return pick === home || pick === away;\n });\n\n if (!target) {\n strandedByMatchId[matchId] = pick;\n strandedHere.add(matchId);\n\n continue;\n }\n\n pickByMatchId[target.id] = pick;\n movedFromByMatchId[target.id] = matchId;\n }\n\n // After the travelling, not during it: a match that carries the stranded note holds no selection\n // at all, even where a pick reached it in the meantime.\n for (const matchId of strandedHere) delete pickByMatchId[matchId];\n }\n\n return { pickByMatchId, movedFromByMatchId, strandedByMatchId };\n};\n","import { BracketRoundSwissData, generateBracketRoundSwissGroupMaps, Bracket } from '../../linked';\nimport {\n BracketComponents,\n BracketElementToCreate,\n createBracketElement,\n createBracketGrid,\n createBracketMasterColumn,\n createBracketMasterColumnSection,\n createBracketSubColumn,\n finalizeBracketGrid,\n} from './core';\nimport { createBracketGapMasterColumn } from './prebuild';\nimport { ComputedBracketGrid, CreateBracketGridConfig } from './types';\nimport { BracketRuntimeError } from '../../bracket-runtime-error';\nimport { BRACKET_ERROR_CODES } from '../../bracket-errors';\n\ntype SwissColumnMetrics = {\n naturalHeight: number;\n stretchableGapCount: number;\n};\n\nconst getSwissGroupBoxPadding = (options: CreateBracketGridConfig) =>\n options.swissGroupPadding + options.swissGroupBorderWidth;\n\nconst calculateSwissColumnMetrics = <TRoundData, TMatchData>(\n groupMap: BracketRoundSwissData<TRoundData, TMatchData>,\n options: CreateBracketGridConfig,\n): SwissColumnMetrics => {\n const includeHeaders = options.roundHeaderHeight > 0;\n const boxPadding = getSwissGroupBoxPadding(options);\n\n let naturalHeight = 0;\n let stretchableGapCount = 0;\n\n for (const [groupIndex, group] of Array.from(groupMap.groups.values()).entries()) {\n if (groupIndex !== 0) {\n // The gap section between two groups\n naturalHeight += options.rowRoundGap;\n stretchableGapCount++;\n }\n\n // The round header gap is not stretchable: the first match should always sit directly\n // below it, no matter how much a column gets stretched.\n if (includeHeaders) {\n naturalHeight += options.roundHeaderHeight + options.roundHeaderGap;\n }\n\n const matchGapCount = Math.max(0, group.matches.size - 1);\n\n naturalHeight += boxPadding * 2 + group.matches.size * options.matchHeight + matchGapCount * options.rowGap;\n stretchableGapCount += matchGapCount;\n }\n\n return { naturalHeight, stretchableGapCount };\n};\n\n// The naturally tallest master column (the round with the most groups) keeps the original\n// gaps (rowGap, rowRoundGap, roundHeaderGap) and defines the total bracket height.\n// The master cols before it are stretched to that height by distributing the missing\n// height evenly across all of their gap elements.\n// The master cols after it keep the original gaps, resulting in a top alignment. They get\n// one more gap element at the end of the column to fill the remaining space if any.\nexport const createSwissGrid = <TRoundData, TMatchData>(\n bracketData: Bracket<TRoundData, TMatchData>,\n options: CreateBracketGridConfig,\n components: BracketComponents<TRoundData, TMatchData>,\n // eslint-disable-next-line max-params -- grid builder signature (data, options, components)\n): ComputedBracketGrid<TRoundData, TMatchData> => {\n const swissGroupMaps = generateBracketRoundSwissGroupMaps(bracketData);\n\n if (!swissGroupMaps)\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.SWISS_GROUPING_FAILED,\n 'Unable to generate Swiss groups for the provided bracket data',\n );\n\n const grid = createBracketGrid<TRoundData, TMatchData>({ spanElementWidth: options.columnWidth });\n\n const groupMaps = Array.from(swissGroupMaps.values());\n const columnMetrics = groupMaps.map((groupMap) => calculateSwissColumnMetrics(groupMap, options));\n\n const totalHeight = Math.max(...columnMetrics.map((metrics) => metrics.naturalHeight));\n const longestColumnIndex = columnMetrics.findIndex((metrics) => metrics.naturalHeight === totalHeight);\n\n for (const [groupMapIndex, groupMap] of groupMaps.entries()) {\n const isLastGroupMap = groupMapIndex === swissGroupMaps.size - 1;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const metrics = columnMetrics[groupMapIndex]!;\n const heightToFill = totalHeight - metrics.naturalHeight;\n const isStretched = groupMapIndex < longestColumnIndex && metrics.stretchableGapCount > 0;\n const gapStretch = isStretched ? heightToFill / metrics.stretchableGapCount : 0;\n\n const rowGap = options.rowGap + gapStretch;\n const rowRoundGap = options.rowRoundGap + gapStretch;\n\n // The border and group padding are part of the column width (the match elements\n // shrink by them), so the column footprint stays at columnWidth and the group borders\n // drawn around the matches don't overflow the bracket container. The padding lives on\n // the match list sections, the header and gap sections stay unpadded and span the\n // whole column width.\n const boxPadding = getSwissGroupBoxPadding(options);\n\n const { masterColumn, pushSection } = createBracketMasterColumn<TRoundData, TMatchData>({\n columnWidth: options.columnWidth,\n padding: {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n },\n });\n\n for (const [groupIndex, group] of Array.from(groupMap.groups.values()).entries()) {\n const isLastGroup = groupIndex === groupMap.groups.size - 1;\n\n if (options.roundHeaderHeight > 0) {\n const firstMatchRound = group.matches.first()?.round;\n\n if (!firstMatchRound)\n throw new BracketRuntimeError(BRACKET_ERROR_CODES.SWISS_GROUP_EMPTY, 'No rounds found in Swiss group');\n\n const headerColumnSection = createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'round',\n });\n\n const headerSubColumn = createBracketSubColumn<TRoundData, TMatchData>({\n span: {\n isStart: true,\n isEnd: true,\n },\n });\n\n const headerElement = createBracketElement<TRoundData, TMatchData>({\n type: 'header',\n area: `h${group.id}`,\n partHeights: [options.roundHeaderHeight],\n elementHeight: options.roundHeaderHeight,\n component: components.roundHeader,\n round: firstMatchRound,\n roundSwissGroup: group,\n });\n\n const headerGapElement = createBracketElement<TRoundData, TMatchData>({\n type: 'roundHeaderGap',\n area: '.',\n partHeights: [options.roundHeaderGap],\n elementHeight: options.roundHeaderGap,\n });\n\n headerSubColumn.pushElement(headerElement.element, headerGapElement.element);\n headerColumnSection.pushSubColumn(headerSubColumn.subColumn);\n pushSection(headerColumnSection.masterColumnSection);\n }\n\n const { masterColumnSection, pushSubColumn } = createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'round',\n padding: {\n bottom: boxPadding,\n left: boxPadding,\n right: boxPadding,\n top: boxPadding,\n },\n });\n\n const { subColumn, pushElement } = createBracketSubColumn<TRoundData, TMatchData>({\n span: {\n isStart: true,\n isEnd: true,\n },\n });\n\n const elementsToCreate: Array<BracketElementToCreate<TRoundData, TMatchData>> = [];\n\n for (const [matchIndex, match] of Array.from(group.matches.values()).entries()) {\n const isLastMatch = matchIndex === group.matches.size - 1;\n\n elementsToCreate.push({\n type: 'match',\n area: `m${match.shortId}`,\n partHeights: [options.matchHeight],\n elementHeight: options.matchHeight,\n component: components.match,\n match,\n round: match.round,\n roundSwissGroup: group,\n });\n\n if (!isLastMatch) {\n elementsToCreate.push({\n type: 'matchGap',\n area: '.',\n partHeights: [rowGap],\n elementHeight: rowGap,\n });\n }\n }\n\n for (const elementData of elementsToCreate) {\n const { element } = createBracketElement(elementData);\n\n pushElement(element);\n }\n\n pushSubColumn(subColumn);\n pushSection(masterColumnSection);\n\n if (!isLastGroup) {\n const groupGapColumnSection = createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'gap',\n });\n\n const groupGapSubColumn = createBracketSubColumn<TRoundData, TMatchData>({\n span: {\n isStart: true,\n isEnd: true,\n },\n });\n\n const groupGapElement = createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'roundGap',\n elementHeight: rowRoundGap,\n partHeights: [rowRoundGap],\n });\n\n groupGapSubColumn.pushElement(groupGapElement.element);\n\n groupGapColumnSection.pushSubColumn(groupGapSubColumn.subColumn);\n\n pushSection(groupGapColumnSection.masterColumnSection);\n }\n }\n\n // Top aligned columns end above the total height, so we fill the remaining space with\n // one last gap element.\n const fillerHeight = isStretched ? 0 : heightToFill;\n\n if (fillerHeight > 0) {\n const fillerColumnSection = createBracketMasterColumnSection<TRoundData, TMatchData>({\n type: 'gap',\n });\n\n const fillerSubColumn = createBracketSubColumn<TRoundData, TMatchData>({\n span: {\n isStart: true,\n isEnd: true,\n },\n });\n\n const fillerElement = createBracketElement<TRoundData, TMatchData>({\n area: '.',\n type: 'colGap',\n elementHeight: fillerHeight,\n partHeights: [fillerHeight],\n });\n\n fillerSubColumn.pushElement(fillerElement.element);\n fillerColumnSection.pushSubColumn(fillerSubColumn.subColumn);\n pushSection(fillerColumnSection.masterColumnSection);\n }\n\n grid.pushMasterColumn(masterColumn);\n\n if (!isLastGroupMap) {\n grid.pushMasterColumn(\n createBracketGapMasterColumn({\n existingMasterColumns: grid.grid.masterColumns,\n columnGap: options.columnGap,\n }),\n );\n }\n }\n\n grid.calculateDimensions();\n\n const finalizedGrid = finalizeBracketGrid(grid);\n\n return {\n raw: grid,\n columns: finalizedGrid.columns,\n matchElementMap: finalizedGrid.elementMap,\n };\n};\n","import { BracketDataLayout } from '../../core';\nimport { FinalizedBracketColumn, FinalizedBracketMatchElementMap, MutableBracketGrid } from './core';\n\nexport type ComputedBracketGrid<TRoundData, TMatchData> = {\n raw: MutableBracketGrid<TRoundData, TMatchData>;\n columns: FinalizedBracketColumn<TRoundData, TMatchData>[];\n matchElementMap: FinalizedBracketMatchElementMap<TRoundData, TMatchData>;\n};\n\n/** Returns the width needed to render a computed bracket grid without horizontal clipping. */\nexport const bracketGridNaturalWidth = <TRoundData, TMatchData>(\n grid: ComputedBracketGrid<TRoundData, TMatchData>,\n): number => grid.raw.grid.dimensions.width;\n\nexport type CreateBracketGridConfig = {\n includeRoundHeaders: boolean;\n columnWidth: number;\n matchHeight: number;\n roundHeaderHeight: number;\n roundHeaderGap: number;\n columnGap: number;\n rowRoundGap: number;\n rowGap: number;\n rowSpanRoundId: string | null;\n /** @internal Resolved by a grid builder from `rowSpanRoundId`. */\n rowSpanMatchCount?: number;\n finalMatchHeight: number;\n finalColumnWidth: number;\n\n /**\n * What the final keeps between its round header and its card, in px, where that is more than\n * `roundHeaderGap`. The room goes to the final's column alone. Unset gives it the same gap as every\n * other round.\n */\n finalRoundHeaderGap?: number | null;\n\n /**\n * How far below the top of the final's card a third place match sits, in px, when the two share a\n * column. Unset (or `null`) gives the third place a column of its own.\n */\n thirdPlaceTopOffset?: number | null;\n swissGroupPadding: number;\n swissGroupBorderWidth: number;\n layout: BracketDataLayout;\n continueElement?: {\n columnWidth: number;\n elementHeight: number;\n } | null;\n};\n","import { BRACKET_ERROR_CODES } from './bracket-errors';\nimport { BracketRuntimeError } from './bracket-runtime-error';\nimport { TournamentMode } from './core';\n\nexport type BracketLayoutRegistration = {\n name: string;\n mode: TournamentMode;\n};\n\nconst LAYOUT_FACTORY_SUGGESTION: Record<TournamentMode, string> = {\n 'single-elimination': 'singleEliminationBracketLayout()',\n 'double-elimination': 'doubleEliminationBracketLayout()',\n 'swiss-with-elimination': 'swissBracketLayout()',\n};\n\n/** Returns the first registered layout matching the tournament mode. */\nexport const resolveBracketLayout = <TLayout extends BracketLayoutRegistration>(\n layouts: readonly TLayout[] | undefined,\n mode: TournamentMode,\n): TLayout => {\n const layout = layouts?.find((candidate) => candidate.mode === mode);\n\n if (!layout) {\n throw new BracketRuntimeError(\n BRACKET_ERROR_CODES.LAYOUT_NOT_REGISTERED,\n `No bracket layout registered for mode \"${mode}\". Add ${LAYOUT_FACTORY_SUGGESTION[mode]} to provideBracketConfig({ layouts: [...] }) or to the layouts input.`,\n );\n }\n\n return layout;\n};\n","/** How a group-table prediction scored on one position, once the real order is in. */\nexport const STANDING_PICK_OUTCOME = {\n /** The participant finished on exactly the predicted position. */\n EXACT: 'exact',\n /** They finished on the predicted side of the advancing line, on another position. */\n PARTIAL: 'partial',\n /** They finished on the other side of the advancing line. */\n WRONG: 'wrong',\n} as const;\n\nexport type StandingPickOutcome = (typeof STANDING_PICK_OUTCOME)[keyof typeof STANDING_PICK_OUTCOME];\n\n/**\n * How the participant predicted on `predictedPosition` scored, given where they really finished.\n *\n * `advancingCount` is how many positions advance, so a position is on the advancing side while it is\n * `<= advancingCount`. Ending up on the other side of that line is `WRONG` whatever the distance; the\n * predicted side of it is `EXACT` on the predicted position and `PARTIAL` on any other.\n *\n * `EXACT` is awarded below the line as well. An app whose API stores only the advancing positions holds no\n * prediction for the rest - the order there is whatever its UI happened to draw - and should narrow the\n * result to `PARTIAL`/`WRONG` itself for those positions.\n *\n * Returns the outcome and no points: what an outcome is worth is a rule of the competition, and\n * `POINTS[outcome]` is a lookup the app already owns.\n */\nexport const standingPickOutcome = (options: {\n /** The position the participant was predicted to finish on, 1-based. */\n predictedPosition: number;\n /** The position they really finished on, 1-based. */\n actualPosition: number;\n /** How many positions advance. */\n advancingCount: number;\n}): StandingPickOutcome => {\n const { predictedPosition, actualPosition, advancingCount } = options;\n const predictedToAdvance = predictedPosition <= advancingCount;\n\n if (predictedToAdvance !== actualPosition <= advancingCount) return STANDING_PICK_OUTCOME.WRONG;\n if (predictedPosition === actualPosition) return STANDING_PICK_OUTCOME.EXACT;\n\n return STANDING_PICK_OUTCOME.PARTIAL;\n};\n","/** A prediction already stored for one position of a group table. */\nexport type StandingPick = {\n /** The position it was stored on, 1-based. */\n position: number;\n /** The participant predicted to finish there. */\n participantId: string;\n};\n\n/**\n * The order to show a group table in before anyone moves a row: every stored pick takes the position it was\n * stored on, and the participants without one follow in the order the backend listed them, filling the gaps.\n *\n * A pick the field cannot hold is dropped rather than drawn - a position outside\n * `1..participantIds.length`, an id that is not in the field, a second pick for a position or for a\n * participant already placed (the lowest position keeps it). The result is therefore always a permutation\n * of `participantIds`.\n */\nexport const standingPickStartOrder = (options: {\n /** The participants, in the order the backend listed them. */\n participantIds: readonly string[];\n /** What is already stored, in any order. */\n picks: readonly StandingPick[];\n}): string[] => {\n const { participantIds, picks } = options;\n const field = new Set(participantIds);\n const byPosition = new Map<number, string>();\n const placed = new Set<string>();\n\n for (const pick of [...picks].sort((left, right) => left.position - right.position)) {\n const holds =\n pick.position >= 1 &&\n pick.position <= participantIds.length &&\n field.has(pick.participantId) &&\n !placed.has(pick.participantId) &&\n !byPosition.has(pick.position);\n\n if (!holds) continue;\n\n byPosition.set(pick.position, pick.participantId);\n placed.add(pick.participantId);\n }\n\n const rest = participantIds.filter((id) => !placed.has(id));\n const order: string[] = [];\n\n for (let position = 1; position <= participantIds.length; position++) {\n const id = byPosition.get(position) ?? rest.shift();\n\n if (id !== undefined) order.push(id);\n }\n\n return order;\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["createNothingToOneRelation","createTwoToOneRelation","createTwoToNothingRelation"],"mappings":"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"}