Phase 0: scaffold cup26 — Vite+React+Fastify TS PWA, broadcast theme, app shell

Mirrors the TTRPG stack (strict TS, Tailwind 4, vite-plugin-pwa, esbuild server
bundle, multi-stage Dockerfile, Traefik compose). Floodlit-pitch design tokens,
UI primitives (Button/Card/Badge), TanStack Router shell with Live/Groups/
Bracket/Predict/Story routes (placeholders), dependency-free PWA icon generator.
Raw data staged: openfootball 2026 fixtures + martj42 international results CSV.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 12:49:13 +02:00
commit 4e4e75a1d8
39 changed files with 53029 additions and 0 deletions
+728
View File
@@ -0,0 +1,728 @@
{"name": "World Cup 2026",
"matches":
[{"round": "Matchday 1",
"date": "2026-06-11",
"time": "13:00 UTC-6",
"team1": "Mexico",
"team2": "South Africa",
"group": "Group A",
"ground": "Mexico City"},
{"round": "Matchday 1",
"date": "2026-06-11",
"time": "20:00 UTC-6",
"team1": "South Korea",
"team2": "Czech Republic",
"group": "Group A",
"ground": "Guadalajara (Zapopan)"},
{"round": "Matchday 8",
"date": "2026-06-18",
"time": "12:00 UTC-4",
"team1": "Czech Republic",
"team2": "South Africa",
"group": "Group A",
"ground": "Atlanta"},
{"round": "Matchday 8",
"date": "2026-06-18",
"time": "19:00 UTC-6",
"team1": "Mexico",
"team2": "South Korea",
"group": "Group A",
"ground": "Guadalajara (Zapopan)"},
{"round": "Matchday 14",
"date": "2026-06-24",
"time": "19:00 UTC-6",
"team1": "Czech Republic",
"team2": "Mexico",
"group": "Group A",
"ground": "Mexico City"},
{"round": "Matchday 14",
"date": "2026-06-24",
"time": "19:00 UTC-6",
"team1": "South Africa",
"team2": "South Korea",
"group": "Group A",
"ground": "Monterrey (Guadalupe)"},
{"round": "Matchday 2",
"date": "2026-06-12",
"time": "15:00 UTC-4",
"team1": "Canada",
"team2": "Bosnia & Herzegovina",
"group": "Group B",
"ground": "Toronto"},
{"round": "Matchday 3",
"date": "2026-06-13",
"time": "12:00 UTC-7",
"team1": "Qatar",
"team2": "Switzerland",
"group": "Group B",
"ground": "San Francisco Bay Area (Santa Clara)"},
{"round": "Matchday 8",
"date": "2026-06-18",
"time": "12:00 UTC-7",
"team1": "Switzerland",
"team2": "Bosnia & Herzegovina",
"group": "Group B",
"ground": "Los Angeles (Inglewood)"},
{"round": "Matchday 8",
"date": "2026-06-18",
"time": "15:00 UTC-7",
"team1": "Canada",
"team2": "Qatar",
"group": "Group B",
"ground": "Vancouver"},
{"round": "Matchday 14",
"date": "2026-06-24",
"time": "12:00 UTC-7",
"team1": "Switzerland",
"team2": "Canada",
"group": "Group B",
"ground": "Vancouver"},
{"round": "Matchday 14",
"date": "2026-06-24",
"time": "12:00 UTC-7",
"team1": "Bosnia & Herzegovina",
"team2": "Qatar",
"group": "Group B",
"ground": "Seattle"},
{"round": "Matchday 3",
"date": "2026-06-13",
"time": "18:00 UTC-4",
"team1": "Brazil",
"team2": "Morocco",
"group": "Group C",
"ground": "New York/New Jersey (East Rutherford)"},
{"round": "Matchday 3",
"date": "2026-06-13",
"time": "21:00 UTC-4",
"team1": "Haiti",
"team2": "Scotland",
"group": "Group C",
"ground": "Boston (Foxborough)"},
{"round": "Matchday 9",
"date": "2026-06-19",
"time": "18:00 UTC-4",
"team1": "Scotland",
"team2": "Morocco",
"group": "Group C",
"ground": "Boston (Foxborough)"},
{"round": "Matchday 9",
"date": "2026-06-19",
"time": "20:30 UTC-4",
"team1": "Brazil",
"team2": "Haiti",
"group": "Group C",
"ground": "Philadelphia"},
{"round": "Matchday 14",
"date": "2026-06-24",
"time": "18:00 UTC-4",
"team1": "Scotland",
"team2": "Brazil",
"group": "Group C",
"ground": "Miami (Miami Gardens)"},
{"round": "Matchday 14",
"date": "2026-06-24",
"time": "18:00 UTC-4",
"team1": "Morocco",
"team2": "Haiti",
"group": "Group C",
"ground": "Atlanta"},
{"round": "Matchday 2",
"date": "2026-06-12",
"time": "18:00 UTC-7",
"team1": "USA",
"team2": "Paraguay",
"group": "Group D",
"ground": "Los Angeles (Inglewood)"},
{"round": "Matchday 3",
"date": "2026-06-13",
"time": "21:00 UTC-7",
"team1": "Australia",
"team2": "Turkey",
"group": "Group D",
"ground": "Vancouver"},
{"round": "Matchday 9",
"date": "2026-06-19",
"time": "12:00 UTC-7",
"team1": "USA",
"team2": "Australia",
"group": "Group D",
"ground": "Seattle"},
{"round": "Matchday 9",
"date": "2026-06-19",
"time": "20:00 UTC-7",
"team1": "Turkey",
"team2": "Paraguay",
"group": "Group D",
"ground": "San Francisco Bay Area (Santa Clara)"},
{"round": "Matchday 15",
"date": "2026-06-25",
"time": "19:00 UTC-7",
"team1": "Turkey",
"team2": "USA",
"group": "Group D",
"ground": "Los Angeles (Inglewood)"},
{"round": "Matchday 15",
"date": "2026-06-25",
"time": "19:00 UTC-7",
"team1": "Paraguay",
"team2": "Australia",
"group": "Group D",
"ground": "San Francisco Bay Area (Santa Clara)"},
{"round": "Matchday 4",
"date": "2026-06-14",
"time": "12:00 UTC-5",
"team1": "Germany",
"team2": "Curaçao",
"group": "Group E",
"ground": "Houston"},
{"round": "Matchday 4",
"date": "2026-06-14",
"time": "19:00 UTC-4",
"team1": "Ivory Coast",
"team2": "Ecuador",
"group": "Group E",
"ground": "Philadelphia"},
{"round": "Matchday 10",
"date": "2026-06-20",
"time": "16:00 UTC-4",
"team1": "Germany",
"team2": "Ivory Coast",
"group": "Group E",
"ground": "Toronto"},
{"round": "Matchday 10",
"date": "2026-06-20",
"time": "19:00 UTC-5",
"team1": "Ecuador",
"team2": "Curaçao",
"group": "Group E",
"ground": "Kansas City"},
{"round": "Matchday 15",
"date": "2026-06-25",
"time": "16:00 UTC-4",
"team1": "Curaçao",
"team2": "Ivory Coast",
"group": "Group E",
"ground": "Philadelphia"},
{"round": "Matchday 15",
"date": "2026-06-25",
"time": "16:00 UTC-4",
"team1": "Ecuador",
"team2": "Germany",
"group": "Group E",
"ground": "New York/New Jersey (East Rutherford)"},
{"round": "Matchday 4",
"date": "2026-06-14",
"time": "15:00 UTC-5",
"team1": "Netherlands",
"team2": "Japan",
"group": "Group F",
"ground": "Dallas (Arlington)"},
{"round": "Matchday 4",
"date": "2026-06-14",
"time": "20:00 UTC-6",
"team1": "Sweden",
"team2": "Tunisia",
"group": "Group F",
"ground": "Monterrey (Guadalupe)"},
{"round": "Matchday 10",
"date": "2026-06-20",
"time": "12:00 UTC-5",
"team1": "Netherlands",
"team2": "Sweden",
"group": "Group F",
"ground": "Houston"},
{"round": "Matchday 10",
"date": "2026-06-20",
"time": "22:00 UTC-6",
"team1": "Tunisia",
"team2": "Japan",
"group": "Group F",
"ground": "Monterrey (Guadalupe)"},
{"round": "Matchday 15",
"date": "2026-06-25",
"time": "18:00 UTC-5",
"team1": "Japan",
"team2": "Sweden",
"group": "Group F",
"ground": "Dallas (Arlington)"},
{"round": "Matchday 15",
"date": "2026-06-25",
"time": "18:00 UTC-5",
"team1": "Tunisia",
"team2": "Netherlands",
"group": "Group F",
"ground": "Kansas City"},
{"round": "Matchday 5",
"date": "2026-06-15",
"time": "12:00 UTC-7",
"team1": "Belgium",
"team2": "Egypt",
"group": "Group G",
"ground": "Seattle"},
{"round": "Matchday 5",
"date": "2026-06-15",
"time": "18:00 UTC-7",
"team1": "Iran",
"team2": "New Zealand",
"group": "Group G",
"ground": "Los Angeles (Inglewood)"},
{"round": "Matchday 11",
"date": "2026-06-21",
"time": "12:00 UTC-7",
"team1": "Belgium",
"team2": "Iran",
"group": "Group G",
"ground": "Los Angeles (Inglewood)"},
{"round": "Matchday 11",
"date": "2026-06-21",
"time": "18:00 UTC-7",
"team1": "New Zealand",
"team2": "Egypt",
"group": "Group G",
"ground": "Vancouver"},
{"round": "Matchday 16",
"date": "2026-06-26",
"time": "20:00 UTC-7",
"team1": "Egypt",
"team2": "Iran",
"group": "Group G",
"ground": "Seattle"},
{"round": "Matchday 16",
"date": "2026-06-26",
"time": "20:00 UTC-7",
"team1": "New Zealand",
"team2": "Belgium",
"group": "Group G",
"ground": "Vancouver"},
{"round": "Matchday 5",
"date": "2026-06-15",
"time": "12:00 UTC-4",
"team1": "Spain",
"team2": "Cape Verde",
"group": "Group H",
"ground": "Atlanta"},
{"round": "Matchday 5",
"date": "2026-06-15",
"time": "18:00 UTC-4",
"team1": "Saudi Arabia",
"team2": "Uruguay",
"group": "Group H",
"ground": "Miami (Miami Gardens)"},
{"round": "Matchday 11",
"date": "2026-06-21",
"time": "12:00 UTC-4",
"team1": "Spain",
"team2": "Saudi Arabia",
"group": "Group H",
"ground": "Atlanta"},
{"round": "Matchday 11",
"date": "2026-06-21",
"time": "18:00 UTC-4",
"team1": "Uruguay",
"team2": "Cape Verde",
"group": "Group H",
"ground": "Miami (Miami Gardens)"},
{"round": "Matchday 16",
"date": "2026-06-26",
"time": "19:00 UTC-5",
"team1": "Cape Verde",
"team2": "Saudi Arabia",
"group": "Group H",
"ground": "Houston"},
{"round": "Matchday 16",
"date": "2026-06-26",
"time": "18:00 UTC-6",
"team1": "Uruguay",
"team2": "Spain",
"group": "Group H",
"ground": "Guadalajara (Zapopan)"},
{"round": "Matchday 6",
"date": "2026-06-16",
"time": "15:00 UTC-4",
"team1": "France",
"team2": "Senegal",
"group": "Group I",
"ground": "New York/New Jersey (East Rutherford)"},
{"round": "Matchday 6",
"date": "2026-06-16",
"time": "18:00 UTC-4",
"team1": "Iraq",
"team2": "Norway",
"group": "Group I",
"ground": "Boston (Foxborough)"},
{"round": "Matchday 12",
"date": "2026-06-22",
"time": "17:00 UTC-4",
"team1": "France",
"team2": "Iraq",
"group": "Group I",
"ground": "Philadelphia"},
{"round": "Matchday 12",
"date": "2026-06-22",
"time": "20:00 UTC-4",
"team1": "Norway",
"team2": "Senegal",
"group": "Group I",
"ground": "New York/New Jersey (East Rutherford)"},
{"round": "Matchday 16",
"date": "2026-06-26",
"time": "15:00 UTC-4",
"team1": "Norway",
"team2": "France",
"group": "Group I",
"ground": "Boston (Foxborough)"},
{"round": "Matchday 16",
"date": "2026-06-26",
"time": "15:00 UTC-4",
"team1": "Senegal",
"team2": "Iraq",
"group": "Group I",
"ground": "Toronto"},
{"round": "Matchday 6",
"date": "2026-06-16",
"time": "20:00 UTC-5",
"team1": "Argentina",
"team2": "Algeria",
"group": "Group J",
"ground": "Kansas City"},
{"round": "Matchday 6",
"date": "2026-06-16",
"time": "21:00 UTC-7",
"team1": "Austria",
"team2": "Jordan",
"group": "Group J",
"ground": "San Francisco Bay Area (Santa Clara)"},
{"round": "Matchday 12",
"date": "2026-06-22",
"time": "12:00 UTC-5",
"team1": "Argentina",
"team2": "Austria",
"group": "Group J",
"ground": "Dallas (Arlington)"},
{"round": "Matchday 12",
"date": "2026-06-22",
"time": "20:00 UTC-7",
"team1": "Jordan",
"team2": "Algeria",
"group": "Group J",
"ground": "San Francisco Bay Area (Santa Clara)"},
{"round": "Matchday 17",
"date": "2026-06-27",
"time": "21:00 UTC-5",
"team1": "Algeria",
"team2": "Austria",
"group": "Group J",
"ground": "Kansas City"},
{"round": "Matchday 17",
"date": "2026-06-27",
"time": "21:00 UTC-5",
"team1": "Jordan",
"team2": "Argentina",
"group": "Group J",
"ground": "Dallas (Arlington)"},
{"round": "Matchday 7",
"date": "2026-06-17",
"time": "12:00 UTC-5",
"team1": "Portugal",
"team2": "DR Congo",
"group": "Group K",
"ground": "Houston"},
{"round": "Matchday 7",
"date": "2026-06-17",
"time": "20:00 UTC-6",
"team1": "Uzbekistan",
"team2": "Colombia",
"group": "Group K",
"ground": "Mexico City"},
{"round": "Matchday 13",
"date": "2026-06-23",
"time": "12:00 UTC-5",
"team1": "Portugal",
"team2": "Uzbekistan",
"group": "Group K",
"ground": "Houston"},
{"round": "Matchday 13",
"date": "2026-06-23",
"time": "20:00 UTC-6",
"team1": "Colombia",
"team2": "DR Congo",
"group": "Group K",
"ground": "Guadalajara (Zapopan)"},
{"round": "Matchday 17",
"date": "2026-06-27",
"time": "19:30 UTC-4",
"team1": "Colombia",
"team2": "Portugal",
"group": "Group K",
"ground": "Miami (Miami Gardens)"},
{"round": "Matchday 17",
"date": "2026-06-27",
"time": "19:30 UTC-4",
"team1": "DR Congo",
"team2": "Uzbekistan",
"group": "Group K",
"ground": "Atlanta"},
{"round": "Matchday 7",
"date": "2026-06-17",
"time": "15:00 UTC-5",
"team1": "England",
"team2": "Croatia",
"group": "Group L",
"ground": "Dallas (Arlington)"},
{"round": "Matchday 7",
"date": "2026-06-17",
"time": "19:00 UTC-4",
"team1": "Ghana",
"team2": "Panama",
"group": "Group L",
"ground": "Toronto"},
{"round": "Matchday 13",
"date": "2026-06-23",
"time": "16:00 UTC-4",
"team1": "England",
"team2": "Ghana",
"group": "Group L",
"ground": "Boston (Foxborough)"},
{"round": "Matchday 13",
"date": "2026-06-23",
"time": "19:00 UTC-4",
"team1": "Panama",
"team2": "Croatia",
"group": "Group L",
"ground": "Toronto"},
{"round": "Matchday 17",
"date": "2026-06-27",
"time": "17:00 UTC-4",
"team1": "Panama",
"team2": "England",
"group": "Group L",
"ground": "New York/New Jersey (East Rutherford)"},
{"round": "Matchday 17",
"date": "2026-06-27",
"time": "17:00 UTC-4",
"team1": "Croatia",
"team2": "Ghana",
"group": "Group L",
"ground": "Philadelphia"},
{"round": "Round of 32",
"num": 73,
"date": "2026-06-28",
"time": "12:00 UTC-7",
"team1": "2A",
"team2": "2B",
"ground": "Los Angeles (Inglewood)"},
{"round": "Round of 32",
"num": 74,
"date": "2026-06-29",
"time": "16:30 UTC-4",
"team1": "1E",
"team2": "3A/B/C/D/F",
"ground": "Boston (Foxborough)"},
{"round": "Round of 32",
"num": 75,
"date": "2026-06-29",
"time": "19:00 UTC-6",
"team1": "1F",
"team2": "2C",
"ground": "Monterrey (Guadalupe)"},
{"round": "Round of 32",
"num": 76,
"date": "2026-06-29",
"time": "12:00 UTC-5",
"team1": "1C",
"team2": "2F",
"ground": "Houston"},
{"round": "Round of 32",
"num": 77,
"date": "2026-06-30",
"time": "17:00 UTC-4",
"team1": "1I",
"team2": "3C/D/F/G/H",
"ground": "New York/New Jersey (East Rutherford)"},
{"round": "Round of 32",
"num": 78,
"date": "2026-06-30",
"time": "12:00 UTC-5",
"team1": "2E",
"team2": "2I",
"ground": "Dallas (Arlington)"},
{"round": "Round of 32",
"num": 79,
"date": "2026-06-30",
"time": "19:00 UTC-6",
"team1": "1A",
"team2": "3C/E/F/H/I",
"ground": "Mexico City"},
{"round": "Round of 32",
"num": 80,
"date": "2026-07-01",
"time": "12:00 UTC-4",
"team1": "1L",
"team2": "3E/H/I/J/K",
"ground": "Atlanta"},
{"round": "Round of 32",
"num": 81,
"date": "2026-07-01",
"time": "17:00 UTC-7",
"team1": "1D",
"team2": "3B/E/F/I/J",
"ground": "San Francisco Bay Area (Santa Clara)"},
{"round": "Round of 32",
"num": 82,
"date": "2026-07-01",
"time": "13:00 UTC-7",
"team1": "1G",
"team2": "3A/E/H/I/J",
"ground": "Seattle"},
{"round": "Round of 32",
"num": 83,
"date": "2026-07-02",
"time": "19:00 UTC-4",
"team1": "2K",
"team2": "2L",
"ground": "Toronto"},
{"round": "Round of 32",
"num": 84,
"date": "2026-07-02",
"time": "12:00 UTC-7",
"team1": "1H",
"team2": "2J",
"ground": "Los Angeles (Inglewood)"},
{"round": "Round of 32",
"num": 85,
"date": "2026-07-02",
"time": "20:00 UTC-7",
"team1": "1B",
"team2": "3E/F/G/I/J",
"ground": "Vancouver"},
{"round": "Round of 32",
"num": 86,
"date": "2026-07-03",
"time": "18:00 UTC-4",
"team1": "1J",
"team2": "2H",
"ground": "Miami (Miami Gardens)"},
{"round": "Round of 32",
"num": 87,
"date": "2026-07-03",
"time": "20:30 UTC-5",
"team1": "1K",
"team2": "3D/E/I/J/L",
"ground": "Kansas City"},
{"round": "Round of 32",
"num": 88,
"date": "2026-07-03",
"time": "13:00 UTC-5",
"team1": "2D",
"team2": "2G",
"ground": "Dallas (Arlington)"},
{"round": "Round of 16",
"num": 89,
"date": "2026-07-04",
"time": "17:00 UTC-4",
"team1": "W74",
"team2": "W77",
"ground": "Philadelphia"},
{"round": "Round of 16",
"num": 90,
"date": "2026-07-04",
"time": "12:00 UTC-5",
"team1": "W73",
"team2": "W75",
"ground": "Houston"},
{"round": "Round of 16",
"num": 91,
"date": "2026-07-05",
"time": "16:00 UTC-4",
"team1": "W76",
"team2": "W78",
"ground": "New York/New Jersey (East Rutherford)"},
{"round": "Round of 16",
"num": 92,
"date": "2026-07-05",
"time": "18:00 UTC-6",
"team1": "W79",
"team2": "W80",
"ground": "Mexico City"},
{"round": "Round of 16",
"num": 93,
"date": "2026-07-06",
"time": "14:00 UTC-5",
"team1": "W83",
"team2": "W84",
"ground": "Dallas (Arlington)"},
{"round": "Round of 16",
"num": 94,
"date": "2026-07-06",
"time": "17:00 UTC-7",
"team1": "W81",
"team2": "W82",
"ground": "Seattle"},
{"round": "Round of 16",
"num": 95,
"date": "2026-07-07",
"time": "12:00 UTC-4",
"team1": "W86",
"team2": "W88",
"ground": "Atlanta"},
{"round": "Round of 16",
"num": 96,
"date": "2026-07-07",
"time": "13:00 UTC-7",
"team1": "W85",
"team2": "W87",
"ground": "Vancouver"},
{"round": "Quarter-final",
"num": 97,
"date": "2026-07-09",
"time": "16:00 UTC-4",
"team1": "W89",
"team2": "W90",
"ground": "Boston (Foxborough)"},
{"round": "Quarter-final",
"num": 98,
"date": "2026-07-10",
"time": "12:00 UTC-7",
"team1": "W93",
"team2": "W94",
"ground": "Los Angeles (Inglewood)"},
{"round": "Quarter-final",
"num": 99,
"date": "2026-07-11",
"time": "17:00 UTC-4",
"team1": "W91",
"team2": "W92",
"ground": "Miami (Miami Gardens)"},
{"round": "Quarter-final",
"num": 100,
"date": "2026-07-11",
"time": "20:00 UTC-5",
"team1": "W95",
"team2": "W96",
"ground": "Kansas City"},
{"round": "Semi-final",
"num": 101,
"date": "2026-07-14",
"time": "14:00 UTC-5",
"team1": "W97",
"team2": "W98",
"ground": "Dallas (Arlington)"},
{"round": "Semi-final",
"num": 102,
"date": "2026-07-15",
"time": "15:00 UTC-4",
"team1": "W99",
"team2": "W100",
"ground": "Atlanta"},
{"round": "Match for third place",
"date": "2026-07-18",
"time": "17:00 UTC-4",
"team1": "L101",
"team2": "L102",
"ground": "Miami (Miami Gardens)"},
{"round": "Final",
"date": "2026-07-19",
"time": "15:00 UTC-4",
"team1": "W101",
"team2": "W102",
"ground": "New York/New Jersey (East Rutherford)"}]}