hydra/.gitignore
Eduardo Salvador c5e9670dbd
feat(leaderboards): add the global leaderboards page (#2961)
* feat(leaderboards): add rank medal styling for top positions

Gold, silver and bronze medals with a subtle glow for ranks 1 to 3, a lighter accent for ranks 4 to 10, theme-overridable colors and reduced-motion support. LBX-1267.

* feat(leaderboards): add animated frame around top three rows

Spinning gold, silver and bronze ring for ranks 1 to 3, static under reduced motion, and export the rank tier helpers. LBX-1267.

* fix(leaderboards): derive the top three ring tint from the theme color

The soft ring tint and highlight now follow --rank-*-color overrides instead of fixed SCSS values. LBX-1267.

* fix(leaderboards): center the medal rank and follow row text color

Draws the medal number inside the SVG at the disc center and lets plain rank numbers inherit the row text color so they stay readable on light themes. LBX-1267.

* refactor(leaderboards): name medal tuning values and mark props read-only

Addresses review: shine stagger, rank accent cutoff and animation durations are named constants, and RankMedal props are Readonly. LBX-1267.

* perf(leaderboards): animate medal shine and top three ring with transforms only

The shine moves with translateX instead of left, and the ring rotates a static conic gradient inside a masked container instead of animating a custom property. Also strengthens the top 10 accent, drops an unused label param and rewrites the SDD in English. LBX-1267.

* perf(leaderboards): size the top three ring spinner to the row diagonal

The spinner is the row width plus a fixed overscan instead of 150%, which still covers the corners while halving the GPU layer on wide rows. LBX-1267.

* feat(leaderboards): show the per-game ranking on the game page

Adds the Ranking sidebar section with week and all-time boards, the viewer row and next-position hint, profile banners, empty, error and signed-out states, and the full ranking modal. Friends scope and extra metrics stay behind GAME_LEADERBOARDS_EXTENDED until LBX-1264. LBX-1266.

* fix(leaderboards): keep ranking rows readable on light themes

Progress track, fill and gap dots follow the row text color, and banner rows always keep light text and a stronger track over the image. LBX-1266.

* fix(leaderboards): format values with the metric of the loaded board

Switching metrics no longer renders the previous board's values with the new unit while the next board loads. LBX-1266.

* feat(leaderboards): use filter dropdowns and pin the viewer row

Scope and period become dropdown filters aligned with the list, metrics use the sliding switch, and the viewer row stays pinned at the bottom of the card even inside the top five. LBX-1266.

* fix(leaderboards): match the signed-out prompt to the ranking states design

Dashed 4px box with 12px text and a compact light Sign in button, as in the Ranking states reference. LBX-1266.

* feat(leaderboards): link the full ranking to the leaderboards page

View full ranking now opens /leaderboards?tab=games&shop=&objectId= instead of a modal. Also keeps loaded boards tied to their game and query, avoids a duplicate viewer row on empty friends boards, and never shows a 0 min gap. LBX-1266.

* feat(leaderboards): render the top three ring element in ranking rows

Uses RankFrameRing from LBX-1267 so the ring animates with transforms only. LBX-1266.

* docs(leaderboards): rewrite the game page leaderboard SDD in English

Matches the repository language and brings the document up to date with the dropdown filters, pinned viewer row, page link and review fixes. LBX-1266.

* feat(leaderboards): add the global leaderboards page

Add the Leaderboards page with the Ranking, By game and Your stats tabs,
weekly and all-time boards, global and friends scopes, the weekly reset
countdown, badges and the viewer's pinned row, reusing the per-game
ranking row and medal. Data goes through one cached renderer client and
metrics the API does not serve yet are hidden.

* feat(leaderboards): open the linked game from the game page ranking

* fix(leaderboards): scope the cache per account and address review findings

Key cached responses by account and drop writes from requests started
before a cache clear. Use the loaded board for the game heading, open a
linked game even when the games list fails, advance the fallback week on
reset, give game cards a minimum width, keep the Top N count in sync with
Show more, and name the heatmap thresholds. Sort request params with
localeCompare and compare the pending request explicitly.

* refactor(leaderboards): address code analysis findings on the leaderboards page

* fix(leaderboards): address review on the game page leaderboard

Restores the game_details show_more string removed by mistake, keys cached and loaded boards by the signed-in account, stops the filter dropdown animation under reduced motion and names the skeleton row count. LBX-1266.

* feat(leaderboards): gate the leaderboards page behind GLOBAL_LEADERBOARDS

* fix(leaderboards): address SonarCloud findings on the game page leaderboard

Sorts cache key params with localeCompare, checks the in-flight promise explicitly, uses an optional chain, marks component props Readonly and gives skeleton rows stable keys. LBX-1266.

* feat(leaderboards): load the metric list from the backend

Read the active metrics from GET /leaderboards/metrics for the ranking
cards, the per-game chips, Your week and the badges, instead of a fixed
list. Names come from the translations by metric id with the backend
label as fallback, values are formatted by value type, icons fall back
to a generic one, and streak and review extras follow the board data.

* refactor(leaderboards): drop the metric id alias and key placeholders by id

* fix(leaderboards): keep the page filters side by side

* feat(leaderboards): add medal labels in Russian and Spanish

Ships the leaderboard namespace in ru and es alongside en and pt-BR. LBX-1267.

* feat(leaderboards): add game page leaderboard strings in Russian and Spanish

Ships the leaderboard namespace keys used by the card in ru and es alongside en and pt-BR, with Russian plural forms for days. LBX-1266.

* fix(leaderboards): address review on the leaderboards page

Show the games empty state when a linked game has no ranked games,
keep errored metrics visible with retry, keep firing the week end
while the countdown is past the reset, round heatmap durations from
the total, share the duration formatting with the game page, read the
game page board through the shared cache with stale eviction and a size
cap, keep the retry callback stable and add ru and es strings.

* feat(leaderboards): gate the full ranking link behind GLOBAL_LEADERBOARDS

The View full ranking button only shows when the global leaderboards page is enabled, so this change never links to a missing route. LBX-1266.

* feat(leaderboards): show the per-game ranking on the game page

Adds the Ranking sidebar section with week and all-time boards, the viewer row and next-position hint, profile banners, empty, error and signed-out states, and the full ranking modal. Friends scope and extra metrics stay behind GAME_LEADERBOARDS_EXTENDED until LBX-1264. LBX-1266.

* fix(leaderboards): keep ranking rows readable on light themes

Progress track, fill and gap dots follow the row text color, and banner rows always keep light text and a stronger track over the image. LBX-1266.

* fix(leaderboards): format values with the metric of the loaded board

Switching metrics no longer renders the previous board's values with the new unit while the next board loads. LBX-1266.

* feat(leaderboards): use filter dropdowns and pin the viewer row

Scope and period become dropdown filters aligned with the list, metrics use the sliding switch, and the viewer row stays pinned at the bottom of the card even inside the top five. LBX-1266.

* fix(leaderboards): match the signed-out prompt to the ranking states design

Dashed 4px box with 12px text and a compact light Sign in button, as in the Ranking states reference. LBX-1266.

* feat(leaderboards): link the full ranking to the leaderboards page

View full ranking now opens /leaderboards?tab=games&shop=&objectId= instead of a modal. Also keeps loaded boards tied to their game and query, avoids a duplicate viewer row on empty friends boards, and never shows a 0 min gap. LBX-1266.

* feat(leaderboards): render the top three ring element in ranking rows

Uses RankFrameRing from LBX-1267 so the ring animates with transforms only. LBX-1266.

* docs(leaderboards): rewrite the game page leaderboard SDD in English

Matches the repository language and brings the document up to date with the dropdown filters, pinned viewer row, page link and review fixes. LBX-1266.

* fix(leaderboards): address review on the game page leaderboard

Restores the game_details show_more string removed by mistake, keys cached and loaded boards by the signed-in account, stops the filter dropdown animation under reduced motion and names the skeleton row count. LBX-1266.

* fix(leaderboards): address SonarCloud findings on the game page leaderboard

Sorts cache key params with localeCompare, checks the in-flight promise explicitly, uses an optional chain, marks component props Readonly and gives skeleton rows stable keys. LBX-1266.

* feat(leaderboards): add game page leaderboard strings in Russian and Spanish

Ships the leaderboard namespace keys used by the card in ru and es alongside en and pt-BR, with Russian plural forms for days. LBX-1266.

* feat(leaderboards): gate the full ranking link behind GLOBAL_LEADERBOARDS

The View full ranking button only shows when the global leaderboards page is enabled, so this change never links to a missing route. LBX-1266.

* fix(leaderboards): address second review round on the leaderboards page

* fix(leaderboards): address review findings on the leaderboards page

* fix(leaderboards): render one decimal for playtime hours

* fix(leaderboards): address review on loading, auth, ranks and cache

Loading shows until the first board arrives instead of flashing an error, only extended requests authenticate, the nudge handles tied ranks, the cache evicts expired and overflowing entries, hours keep one decimal under 10 h, the sign-in copy matches the flag, the full ranking link carries the current selection, and the unused periodEnd and the internal SDD are removed. LBX-1266.

* fix(leaderboards): keep the game board while the list reloads and hide raw badge progress

* fix(leaderboards): retry the board anonymously when the session is stale

A signed-in request that fails with UserNotLoggedInError is retried without auth, so a stale session never shows the error state on a public board. LBX-1266.

* fix(leaderboards): evict unparseable responses, keep the viewer delta and show failed stats ranks

* refactor(leaderboards): extract the previous rank lookup in the board view
2026-10-22 15:29:14 -03:00

33 lines
500 B
Text

.vscode/
node_modules/
__pycache__
dist
out
.DS_Store
*.log*
*.tsbuildinfo
.env
.env.local
.env.*.local
.vite
ludusavi/**
!ludusavi/config.yaml
/hydra-native/
/legendary/
native/hydra-native/target/
native/epic-prerequisite-runner/target/
binaries/epic-prerequisite-runner/
# Sentry Config File
.env.sentry-build-plugin
*storybook.log
Future-updates.md
TO-DO.md
.planning/
.claude/
.cache/
native/torrent-bridge/build/
native/torrent-bridge/vcpkg_installed/
*.local.ts
src/renderer/public/*.local/