Sport
The basketball pages fans get — teams, players, coaches, games, standings and stats — with live scores and widgets.
Basketball data pages
The basketball pages are what makes this site EuroLeague Basketball's rather than a news site.
They are Euro League's own — the basketball domain does not exist in the Publishing Hub template — and
they draw their data from the Competition Engine, ELB's competition data service, not from
Contentful. Editors do not author these pages; where Contentful holds something about a team or a
player (an editorial name, a crest, a picture, socials, a biography), the editor's value wins
when it is set and the engine fills in everything else.
Every area follows the same shape: a list per competition, and one page per team, player, coach
or game whichever competitions it plays in. A bare area address (/en/teams) takes the visitor to
the default competition's list (EuroLeague's).
| Area | What fans get | Example addresses | Status |
|---|---|---|---|
| Teams | Every club of a season as a card (record, rank, form, next game), with a search and a season filter; each club's page with its games and stats, and its roster as a page of its own | /en/teams/euroleague, /en/teams/<team>, /en/teams/<team>/roster |
Available |
| Players | The players of a competition, 24 to a page, with search and a players-stats view; each player's page with their stats, news & video, profile and records | /en/players/euroleague, /en/players/euroleague/stats, /en/players/<player> |
Available |
| Coaches | Each coach's page: their profile, record with the club and career records | /en/coaches/<coach> |
Available (page) · lists are a temporary page |
| Games | The schedule, round by round and season by season, with live scores; each game's own page — the Game Centre (below) | /en/games/eurocup, /en/games/eurocup/season/2025-26/round/12, /en/games/<game> |
Available |
| Standings | A competition's table for the current or a past season, and a Format view of the play-off structure | /en/standings/euroleague, /en/standings/euroleague/format |
Available (the play-off bracket is provisional) |
| Stats | A season's stats hub: league leaders for players and teams (this season or all time), the players table and the team rankings | /en/stats/euroleague, /en/stats/euroleague/players |
Available |
Notes on the statuses:
- Coaches lists are a temporary page (the area's header, the competitions to choose from and a note) because the Competition Engine does not yet list coaches and the list has no design. A coach's own page is real. The temporary page's address is final, so nothing that links to it will change when the real list replaces it.
- The play-off bracket is worked out from the games the engine serves, because the engine has no endpoint describing the play-off structure yet. It is replaced as soon as one exists.
- Corporate has no data areas:
/en/teams/corporateis not found, by configuration (club.config.ts→sections.capabilities).
Each list and page is indexed by search engines and carries structured data (teams, people, games). Every page has exactly one address: tabs on a team, player or coach page are reached in the page itself, and old or alternative spellings of an address redirect to the one it has.
The header's club crests
Every page carries a strip of the current competition's club crests in the header, each linking to that club's page. It comes from the Competition Engine and follows the section the visitor is in (EuroCup's clubs inside EuroCup's section, EuroLeague's everywhere else).
Switching the area off
The whole domain can be switched off for an environment with BASKETBALL_ROUTES=false: every data
page and its live-data endpoints answer "not found", the sitemap leaves them out, the header's
crests are not drawn and the widgets below disappear. Staging runs that way until basketball is
switched on there. Links that editors have pointed at these areas in the navigation are theirs to
remove.
For developers: @v4/basketball-app (the routes), @v4/competition-engine (the data and the Contentful merge) and @v4/ghost-basketball (the 139 UI components).
Game Centre and live scores
The Game Centre
Every game has one page, /en/games/<game>, that is its Game Centre before, during and after
the game — the address never changes, so a link shared before tip-off still works at the final
buzzer. The page shows the score card and the game's modules in tabs: the box score, team
statistics, play-by-play (filterable by period, scoring plays, team and substitutions), the
score by minute, the two clubs' head-to-head meetings, their season so far and their squads'
season records, and the game's news and videos.
A module is shown only when the engine has data for it — a game the live feed never covered has no play-by-play, for example — and nothing is filled with placeholder content. Line-ups, the media in the hero and a partner card have no data source yet and are not shown.
Watching the game: the Game Centre links out to EuroLeague TV (the address is configurable
per environment, NEXT_PUBLIC_ELTV_WATCH_URL, and defaults to https://euroleague.tv). An
embedded ELTV player has been built but is not yet placed on the page — see
The video section.
| Capability | Status |
|---|---|
| One Game Centre page per game, pre-match to full time | Available |
| Live score card and modules while the game is played | Available |
| News and videos about the game | Available |
| Line-ups, hero media, partner card | Planned (no data source yet) |
| Watch on EuroLeague TV | Available as a link out; embedded player In development |
Live scores
Live scores are real, and they come from the Competition Engine. While a game can be live, the visitor's browser asks the site for its latest state at the interval the engine asks for (every few seconds during play, less often before tip-off) and stops asking once the game is final. The site passes the engine's answer straight through and never stores a live answer in its own cache, so what a fan sees is always current.
Live updates reach:
- the Game Centre — the score card and every module;
- the schedule on the Games page — each game's score and status;
- the home page hero — while one of today's games is being played, its widgets give way to the game's score card, points by quarter and game situation (see Widgets across the site).
This is ordinary polling of the site's own endpoints (/api/games/live, /api/live/games), not a
realtime push service: no third-party realtime provider is involved. The motion that marks a
score change decorates the update but never delays it.
Widgets across the site
Basketball data does not stay in the data pages. Small panels of live competition data — the header widgets of ELB's "Header widgets · EuroLeague" specification — appear on editorial pages too, so a fan reading the news is one click from the game.
The home page hero
The home page's hero has three widget areas, filled for the homepage's competition (Corporate's homepage shows EuroLeague's):
- the standings — in season, after the latest round; off season, the final table;
- the MVP — the latest complete round's most valuable player (the highest performance index rating in that round's box scores);
- league leaders per game (points, rebounds, assists) — or, on a game day before tip-off, that day's games in their place.
While one of today's games is being played, the areas switch to that game, live.
Article headers
An article's header shows up to two widgets beside its picture, chosen by what the article is about, using the associations an editor sets on it (its game, round, teams and competition): the article's game as it stands right now (upcoming, live or final), then more on the game or on the clubs involved. What a widget shows is decided when the page is read, not when the article was published — an old article about a team shows that team's next game today. A widget with no data simply does not appear, and with none at all the picture spans the full header.
Team, player and coach pages
The heroes of the team, player and coach pages carry their own widgets: a club's form and next game, and a coach's record with the club.
| Capability | Status |
|---|---|
| Home hero widgets | Available |
| Article header widgets | Available (some planned widgets — head to head, top players, round MVP — are not built yet and drop out) |
| Team, player and coach hero widgets | Available |
All of these switch off with the basketball area (BASKETBALL_ROUTES=false): the home hero's
areas stay empty and articles show their picture full width.
Competition sections
The site is one website for every competition — EuroLeague, EuroCup, NextGen and the Corporate site — rather than a site each. Each competition is a Competition entry in Contentful, and its slug is its section's address. EuroLeague is the default competition, so its pages have no prefix.
| What | EuroLeague (the default) | Another competition |
|---|---|---|
| Home page | /en |
/en/eurocup |
| A content page | /en/about |
/en/eurocup/about |
| News | /en/news |
/en/news/eurocup |
| Video | /en/video |
/en/video/eurocup |
| Teams, players, games, standings, stats | /en/teams/euroleague |
/en/teams/eurocup |
| A team, player, coach, game or article | one address whichever competition it belongs to (/en/teams/<team>, /en/news/<article>) |
What fans notice:
- The menus follow the section. Inside EuroCup's section, the navigation's Home, News, Video and data links lead to EuroCup's pages.
- A competition switcher in the header moves between the competitions' sections.
- Competition themes. EuroCup's and NextGen's sections wear their own colours (Token Studio
themes in
packages/tokens-euro-league); every other page — EuroLeague's, and the single pages of teams, players, games and articles — wears EuroLeague's. - Every competition has its news. If an editor has not set up a listing for a competition, the site generates one from the articles tagged with it.
- Corporate is different by configuration: it has no basketball data pages, no video home and
no place in the competition switcher (
club.config.ts→sections.capabilities). A new competition needs no configuration: it gets everything.
| Capability | Status |
|---|---|
| Per-competition home, content, news and data pages | Available |
| Competition switcher and section-aware menus | Available |
| EuroCup and NextGen themes | Available |
| Per-competition video homes | Available where a competition has its own Video Landing Page; otherwise a temporary page |
The full address rules, redirects and how a page's section is decided are in Competition sections.
Add to calendar
The Games page offers Add to calendar through ECAL: a fan chooses all of a competition's
games or a single team's, and ECAL's own screens take them through subscribing in their calendar
app. Each competition's ECAL display is configured in club.config.ts.
Status: Available, switched on by environment — the button appears only where
NEXT_PUBLIC_ECAL_API_KEY is set. See @v4/ecal.
Motion
Movement on the site follows ELB's own motion specification (EuroLeague Motion Spec v0.3, a draft for pilot): cards and table rows arrive in a short cascade, live scores and figures change, tables reorder, and tabs and menus open. What a fan or reviewer should notice:
- Data never waits for motion. A live score, a sorted table or a filter result is on the page at once; motion only decorates its arrival.
- Entrances play once per visit. Scrolling back or returning to a page does not replay them; new data (a new round, season or sort) does.
- Reduced motion is respected completely. A visitor who has asked their device for less motion gets the finished page instantly, with nothing moving.
Status: Available, tracking a draft specification. How motion is specified, built and tested is in Motion.