Компоненты/Турнирная сетка плей-офф

Турнирная сетка плей-офф

29 сентября 2026

Сетка плей-офф листается по раундам: карточки матчей, коленчатые соединители и заголовки плавно перестраиваются под каждый шаг.

Установка

npm install clsx lucide-react motion tailwind-merge
pnpm add clsx lucide-react motion tailwind-merge
yarn add clsx lucide-react motion tailwind-merge
bun add clsx lucide-react motion tailwind-merge

Файлы

knockout-bracket.tsx
НазадКлавиатураДалееПревью ссылки

Турнирная сетка плей-офф, в которой одновременно видны три соседних раунда. Карточки матчей показывают дату, флаги, счёт и серию пенальти, проигравшая сторона приглушена, а победитель отмечен треугольником.

Стрелки в шапке листают сетку на раунд вперёд или назад: колонки и заголовки уезжают в сторону, карточки следующих раундов выстраиваются по центрам своих пар, а коленчатые соединители растягиваются и сжимаются вслед за ними. Внизу идут живые часы в выбранном часовом поясе.

Вручную

Скопируйте эти файлы в components/knockout-bracket/:

Общие помощники положите в lib/ проекта:

Проверьте алиас путей. Импорты в коде выше записаны как @/components/... и @/lib/.... Нужен алиас "@/*" на папку, где лежат components/ и lib/, в tsconfig.json — или поправьте импорты под свои пути.

Использование

import { KnockoutBracket, ROUNDS } from "@/components/knockout-bracket/knockout-bracket";

export function Playoffs() {
return <KnockoutBracket rounds={ROUNDS} initialRound={2} columnGap={48} />;
}

Пропсы

Пропс
Описание
rounds

Раунды с названиями и матчами

Тип Round[]

initialRound?

Раунд, с которого начинается просмотр

Тип number·По умолчанию 1

footer?

Подвал под сеткой; null скрывает его

Тип ReactNode·По умолчанию <LiveClock />

duration?

Длительность перестройки в секундах

Тип number·По умолчанию 0.5

columnGap?

Зазор между раундами в пикселях

Тип number·По умолчанию 40

rowGap?

Зазор между матчами в пикселях

Тип number·По умолчанию 32

cardRadius?

Скругление карточек в пикселях

Тип number·По умолчанию 16

cardColor?

Цвет фона карточек

Тип string

className?

Классы корневого блока

Тип string

LiveClock принимает timeZone (по умолчанию "Asia/Singapore") и zoneLabel (по умолчанию "UTC+8").