Breakpoints at 600px (tablet) and 420px (mobile):
- Header: smaller emblem and title on mobile
- StandingsTable: hide DV/DT/Vorm at 600px, also W/D/L at 420px
- TeamMatchesModal: bottom sheet on mobile, hide matchday column
- CompetitionPicker: smaller buttons, hide country label on mobile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously emblems were only cached after visiting each competition.
Now a single /api/competitions fetch on mount populates all emblems
at once, including the initially selected button.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Free plan allows 10 requests/min; show a Dutch user-friendly message
instead of a generic API error.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Multi-stage Dockerfile: Node builds static assets, nginx serves them
- nginx proxies /api/* to football-data.org and injects X-Auth-Token
server-side via FOOTBALL_API_KEY env var (key never in browser bundle)
- docker-compose.yml exposes the app on port 3000
- Extract apiFetch() helper: sends key in dev (Vite proxy), skips in prod
- .env.example updated with both dev and production key vars
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vite + React app using football-data.org API to display standings
and match details for 12 competitions. Supports competition switching,
team match history modal, and Vite proxy to handle CORS.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>