Webv3 leaderboards
Read this when you change a Webv3 leaderboard or reuse its standings table.
/leaderboard/latest, /leaderboard/yearly/$year and /leaderboard/all-time
keep Webv2's paths, including an optional trailing page number such as
/leaderboard/all-time/2. Like Webv2, a page or year segment reads its leading
integer, a missing or unreadable page is page 1 and an unreadable year is the
current UTC year. Pages hold 50 participants.
frontend/apps/webv3/src/lib/leaderboard.tsowns the server functions and query options: standings for aStandingsScope(one contest, one year or all time), the latest official contest's board, and whether the signed-in viewer has joined a contest.frontend/apps/webv3/src/lib/leaderboard.server.tsreads standings and contests anonymously through the generated client; only the registration read forwards the session cookies.frontend/apps/webv3/src/components/Standings.tsxrenders one page of any scope: tied ranks asTon one line, scores always with one decimal, gold, silver and bronze marks on the top three ranks, rows that open the participant's profile from anywhere on the row, the signed-in viewer's row, pagination with its participant range when there is more than one page, and the empty, failed and past-the-end states. The screen supplies the scope caption and the page and profile links.frontend/apps/webv3/src/components/LeaderboardPage.tsxholds the shared title and period tabs and the yearly and all-time boards, which count official contests only, say so beside the table and list the years since 2020.frontend/apps/webv3/src/components/ContestLeaderboard.tsxcomposes the latest official contest with its join action and conditions. The contest page shares this board.
Every board names its scope: the latest board titles its contest, and the selected period and year tabs name the yearly and all-time boards, whose standings region carries the scope as its accessible name. The contest's phase follows the UTC day the board was read, as on the homepage. Yearly and all-time participants link to their Webv3 profile statistics; the latest contest's participants open their native contest profile. Contest details and Join contest open the native contest page and registration. When no official contest exists, the latest board says so; the API's 404 is not an error. Name search, "Find my row" and a separate personal position are not available.