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}
| Route | What 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], pick | One market or pick |
venue, landscape-view | The 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.