d56abcd7a9
Press L to open a leaderboard overlay. On open, an async fetch is dispatched against the active SyncProvider. Results cache in LeaderboardResource; the panel rebuilds live when data arrives. Closing during a fetch is safe (ClosedThisFrame flag prevents re-spawning the panel in the same frame as the user's despawn command). Format: ranked table with player name, best score, and fastest win time. Non-authenticated / LocalOnly providers return an empty list gracefully. - solitaire_data: add fetch_leaderboard() to SyncProvider trait (default → Ok([])) and implement in SolitaireServerClient - solitaire_engine: new LeaderboardPlugin with 5 unit tests - solitaire_app: register LeaderboardPlugin Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>