Surface projected final points on the full standings page and restructure
the rank/point change indicators so columns align cleanly on desktop and
mobile.
- StatHelpers: stacked label/value/delta columns with a per-row reservable
delta line; merge rank/point indicators into a single DeltaBadge;
parameterize StatDivider height.
- StandingsPreview: opt-in `showProjected` column (projected points only),
gated on participants remaining; reserve the delta line only when a row
actually moved (no stray em-dashes).
- Full standings page: pass projected data + showProjected (hidden when the
season is complete).
- League home: fetch via getSevenDayStandingsChange so the preview shows the
same 7-day rank/point changes as the full standings page.
- LeagueRow: top-align stats and restore h-8 dividers so the shared-component
changes don't alter the league list rows.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* Add opencode oxlint plugin and UI refinements
- Add .opencode/plugins/oxlint.ts to run oxlint automatically on file edits
- Refactor RankingDisplay into shared StatHelpers component
- Add tied rank display support in home loader
- Update navbar with NavLink for active state styling
- Replace .reverse() with .toReversed() in RecentPicksFeed
* Remove unused RankChangeIndicator import in LeagueRow
Logo SVGs referenced by string path (/logo.svg) were cached by CDNs and
browsers after deployments. Import them with Vite's ?url suffix so the
build emits content-hashed filenames that force a refresh on change.
LeagueRow and StandingsPreview had duplicated StatColumn, StatDivider,
and rank-change indicator helpers. Extract them into a shared
StatHelpers module so both pages render rank and points identically
(#3 style with consistent rank-change arrows).