StatsHub Docs
Features

Detail screens

One fixture, team, player, league, referee or prop — and the bridges that let a row open a screen without threading a callback.

src/app/{fixture,player,team,league,referee,basketball,prop}

RouteWhat it is
fixture/[fixtureSlug]/[fixtureId]One match, with section and view routes below it
team/[teamSlug]/[teamId], player/[playerSlug]/[playerId]One team or player and its selected view
league/[leagueSlug]/[leagueId], referee/[refereeSlug]/[refereeId]One competition or referee
basketball/{fixture,player,team}/…Basketball entity details in the same shared stack
prop/[id], pickOne market or pick
venue, landscape-viewThe two that are neither

The shell owns cross-tab pushes

An entity does not belong to the tab from which it happened to be opened. Every fixture, team, player, league, referee, venue, and expanded visual is a direct screen in the shell stack above (tabs). Opening one from Matches, Trends, Props, or StatsHub therefore preserves the selected tab below it and gives the screen the platform's native Back item and interactive-pop transition.

Do not add a shared detail below an individual tab layout. Do not replace the native Back item with a JavaScript toolbar callback. The drawer button is a tab root action; pushed screens show native Back.

Internal callers use the builders in src/lib/core/entity-routes.ts. They name all dynamic params once and prevent ID-only redirect pushes or as Href assertions from hiding a stale URL. The old /fixture/:id, /player/:id, /team/:id, and /referee/:id routes no longer exist.

Fixture sections are routes

A match has more in it than fits on a phone — lineups, stats, odds across books, and each player's line. The fixture detail therefore has canonical section and view routes below the same shell stack screen family. Auxiliary overlays such as odds comparison and game-cell detail use real fixture/* routes configured as modals in the root stack, not screens inside a tab.

Board-card settings use their own nested modal stack: what a fixture or tool shows is the reader's choice, but changing those settings is not a new detail screen.

Landscape

landscape-view exists because some of this data is a wide table and a phone held sideways is the only way to see it. It is a route, not a rotation handler, so it can be opened deliberately rather than by accident — and see Resizing for what a size change has to survive.

The bridges

fixture-game-cell-bridge.ts, fixture-odds-compare-bridge.ts, landscape-view-bridge.ts, venue-bridge.ts and the rest.

A row deep in a list needs to open a detail screen with context the router alone cannot carry. The bridge is a small module holding that hand-off, so the list does not take a callback prop threaded down four levels and the screen does not read something global.

On this page