refactor: replace hardcoded hex colors with theme tokens, move data/ to root

- Add --color-green-mid token (#4a7a55) to @theme for dimmer stat values
- Replace all text-[#hex]/bg-[#hex] arbitrary values with named tokens:
  text-green, text-green-light, text-green-sec, text-green-muted,
  text-green-dark, text-green-mid, text-text, bg-card, bg-bg, border-border
- Replace rgba(34,197,94,X) inline styles with bg-green/X opacity modifiers
- Convert single-prop style={{ borderColor/background }} to className
- Fix SVG stroke="#dff5e8" → stroke="currentColor"
- Use CSS variables in globals.css base styles (background-color, color)
- Move app/data/wikipedia/ → data/ (project root, not inside Next.js app dir)
- Update Dockerfile, seed.ts, scrape-wikipedia.ts paths accordingly
- Remove unused app/data/world_cup.csv

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 18:08:23 +02:00
parent 187ee2e312
commit b141356247
125 changed files with 279 additions and 322 deletions
+692
View File
@@ -0,0 +1,692 @@
{
"matches": [
{
"round": "Round of 16",
"date": "1938-06-04",
"time": "17:00",
"team1": "Switzerland",
"team2": "Germany",
"score": {
"ft": [
1,
1
],
"et": [
1,
1
]
},
"goals1": [
{
"name": "Abegglen",
"minute": 43
}
],
"goals2": [
{
"name": "Gauchel",
"minute": 29
}
],
"ground": "Parc des Princes, Paris"
},
{
"round": "Round of 16",
"date": "1938-06-05",
"time": "17:00",
"team1": "Hungary",
"team2": "Dutch East Indies",
"score": {
"ft": [
6,
0
]
},
"goals1": [
{
"name": "Kohut",
"minute": 13
},
{
"name": "Toldi",
"minute": 15
},
{
"name": "G. Sárosi",
"minute": 25
},
{
"name": "G. Sárosi",
"minute": 89
},
{
"name": "Zsengellér",
"minute": 30
},
{
"name": "Zsengellér",
"minute": 76
}
],
"ground": "Vélodrome Municipal, Reims"
},
{
"round": "Round of 16",
"date": "1938-06-05",
"team1": "Sweden",
"team2": "Austria",
"ground": "Stade Gerland, Lyon"
},
{
"round": "Round of 16",
"date": "1938-06-05",
"time": "17:00",
"team1": "Cuba",
"team2": "Romania",
"score": {
"ft": [
2,
2
],
"et": [
3,
3
]
},
"goals1": [
{
"name": "Socorro",
"minute": 44
},
{
"name": "Socorro",
"minute": 103
},
{
"name": "Magriñá",
"minute": 69
}
],
"goals2": [
{
"name": "Bindea",
"minute": 35
},
{
"name": "Barátky",
"minute": 88
},
{
"name": "Dobay",
"minute": 105
}
],
"ground": "Stade du T.O.E.C., Toulouse"
},
{
"round": "Round of 16",
"date": "1938-06-05",
"time": "17:00",
"team1": "France",
"team2": "Belgium",
"score": {
"ft": [
3,
1
]
},
"goals1": [
{
"name": "Veinante",
"minute": 1
},
{
"name": "Nicolas",
"minute": 16
},
{
"name": "Nicolas",
"minute": 69
}
],
"goals2": [
{
"name": "Isemborghs",
"minute": 38
}
],
"ground": "Stade Olympique de Colombes, Colombes"
},
{
"round": "Round of 16",
"date": "1938-06-05",
"time": "17:00",
"team1": "Italy",
"team2": "Norway",
"score": {
"ft": [
1,
1
],
"et": [
2,
1
]
},
"goals1": [
{
"name": "Ferraris",
"minute": 2
},
{
"name": "Piola",
"minute": 94
}
],
"goals2": [
{
"name": "Brustad",
"minute": 83
}
],
"ground": "Stade Vélodrome, Marseille"
},
{
"round": "Round of 16",
"date": "1938-06-05",
"time": "17:00",
"team1": "Brazil",
"team2": "Poland",
"score": {
"ft": [
4,
4
],
"et": [
6,
5
]
},
"goals1": [
{
"name": "Leônidas",
"minute": 18
},
{
"name": "Leônidas",
"minute": 93
},
{
"name": "Leônidas",
"minute": 104
},
{
"name": "Romeu",
"minute": 25
},
{
"name": "Perácio",
"minute": 44
},
{
"name": "Perácio",
"minute": 71
}
],
"goals2": [
{
"name": "Scherfke",
"minute": 23,
"penalty": true
},
{
"name": "Wilimowski",
"minute": 53
},
{
"name": "Wilimowski",
"minute": 59
},
{
"name": "Wilimowski",
"minute": 89
},
{
"name": "Wilimowski",
"minute": 118
}
],
"ground": "Stade de la Meinau, Strasbourg"
},
{
"round": "Round of 16",
"date": "1938-06-05",
"time": "17:00",
"team1": "Czechoslovakia",
"team2": "Netherlands",
"score": {
"ft": [
0,
0
],
"et": [
3,
0
]
},
"goals1": [
{
"name": "Košťálek",
"minute": 96
},
{
"name": "Nejedlý",
"minute": 111
},
{
"name": "Zeman",
"minute": 118
}
],
"ground": "Stade municipal, Le Havre"
},
{
"round": "Round of 16",
"date": "1938-06-09",
"time": "18:00",
"team1": "Switzerland",
"team2": "Germany",
"score": {
"ft": [
4,
2
]
},
"goals1": [
{
"name": "Walaschek",
"minute": 42
},
{
"name": "Bickel",
"minute": 64
},
{
"name": "Abegglen",
"minute": 75
},
{
"name": "Abegglen",
"minute": 78
}
],
"goals2": [
{
"name": "Hahnemann",
"minute": 8
},
{
"name": "Lörtscher",
"minute": 22,
"owngoal": true
}
],
"ground": "Parc des Princes, Paris"
},
{
"round": "Round of 16",
"date": "1938-06-09",
"time": "18:00",
"team1": "Cuba",
"team2": "Romania",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Socorro",
"minute": 51
},
{
"name": "Fernández",
"minute": 57
}
],
"goals2": [
{
"name": "Dobay",
"minute": 35
}
],
"ground": "Stade du T.O.E.C., Toulouse"
},
{
"round": "Quarter-finals",
"date": "1938-06-12",
"time": "17:00",
"team1": "Hungary",
"team2": "Switzerland",
"score": {
"ft": [
2,
0
]
},
"goals1": [
{
"name": "G. Sárosi",
"minute": 40
},
{
"name": "Zsengellér",
"minute": 89
}
],
"ground": "Stade Victor Boucquey, Lille"
},
{
"round": "Quarter-finals",
"date": "1938-06-12",
"time": "17:00",
"team1": "Sweden",
"team2": "Cuba",
"score": {
"ft": [
8,
0
]
},
"goals1": [
{
"name": "H. Andersson",
"minute": 9
},
{
"name": "H. Andersson",
"minute": 81
},
{
"name": "H. Andersson",
"minute": 89
},
{
"name": "Wetterström",
"minute": 22
},
{
"name": "Wetterström",
"minute": 37
},
{
"name": "Wetterström",
"minute": 44
},
{
"name": "Keller",
"minute": 80
},
{
"name": "Nyberg",
"minute": 84
}
],
"ground": "Stade du Fort Carré, Antibes"
},
{
"round": "Quarter-finals",
"date": "1938-06-12",
"time": "17:00",
"team1": "Italy",
"team2": "France",
"score": {
"ft": [
3,
1
]
},
"goals1": [
{
"name": "Colaussi",
"minute": 9
},
{
"name": "Piola",
"minute": 51
},
{
"name": "Piola",
"minute": 72
}
],
"goals2": [
{
"name": "Heisserer",
"minute": 10
}
],
"ground": "Stade Olympique de Colombes, Colombes"
},
{
"round": "Quarter-finals",
"date": "1938-06-12",
"time": "17:00",
"team1": "Brazil",
"team2": "Czechoslovakia",
"score": {
"ft": [
1,
1
],
"et": [
1,
1
]
},
"goals1": [
{
"name": "Leônidas",
"minute": 30
}
],
"goals2": [
{
"name": "Nejedlý",
"minute": 65,
"penalty": true
}
],
"ground": "Parc Lescure, Bordeaux"
},
{
"round": "Quarter-finals",
"date": "1938-06-14",
"time": "18:00",
"team1": "Brazil",
"team2": "Czechoslovakia",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Leônidas",
"minute": 57
},
{
"name": "Roberto",
"minute": 62
}
],
"goals2": [
{
"name": "Kopecký",
"minute": 25
}
],
"ground": "Parc Lescure, Bordeaux"
},
{
"round": "Semi-finals",
"date": "1938-06-16",
"time": "18:00",
"team1": "Hungary",
"team2": "Sweden",
"score": {
"ft": [
5,
1
]
},
"goals1": [
{
"name": "Jacobsson",
"minute": 19,
"owngoal": true
},
{
"name": "Titkos",
"minute": 37
},
{
"name": "Zsengellér",
"minute": 39
},
{
"name": "Zsengellér",
"minute": 85
},
{
"name": "G. Sárosi",
"minute": 65
}
],
"goals2": [
{
"name": "Nyberg",
"minute": 1
}
],
"ground": "Parc des Princes, Paris"
},
{
"round": "Semi-finals",
"date": "1938-06-16",
"time": "18:00",
"team1": "Italy",
"team2": "Brazil",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Colaussi",
"minute": 51
},
{
"name": "Meazza",
"minute": 60,
"penalty": true
}
],
"goals2": [
{
"name": "Romeu",
"minute": 87
}
],
"ground": "Stade Vélodrome, Marseille"
},
{
"round": "Third-place match",
"date": "1938-06-19",
"time": "17:00",
"team1": "Brazil",
"team2": "Sweden",
"score": {
"ft": [
4,
2
]
},
"goals1": [
{
"name": "Romeu",
"minute": 44
},
{
"name": "Leônidas",
"minute": 63
},
{
"name": "Leônidas",
"minute": 74
},
{
"name": "Perácio",
"minute": 80
}
],
"goals2": [
{
"name": "Jonasson",
"minute": 28
},
{
"name": "Nyberg",
"minute": 38
}
],
"ground": "Parc Lescure, Bordeaux"
},
{
"round": "Final",
"date": "1938-06-19",
"time": "17:00",
"team1": "Italy",
"team2": "Hungary",
"score": {
"ft": [
4,
2
]
},
"goals1": [
{
"name": "Colaussi",
"minute": 6
},
{
"name": "Colaussi",
"minute": 35
},
{
"name": "Piola",
"minute": 16
},
{
"name": "Piola",
"minute": 82
}
],
"goals2": [
{
"name": "Titkos",
"minute": 8
},
{
"name": "G. Sárosi",
"minute": 70
}
],
"ground": "Stade Olympique de Colombes, Paris"
}
]
}
+8
View File
@@ -0,0 +1,8 @@
{
"host": "France",
"teams_count": 15,
"winner": "Italy",
"runner_up": "Hungary",
"third_place": "Brazil",
"fourth_place": "Sweden"
}
+48
View File
@@ -0,0 +1,48 @@
{
"stadiums": [
{
"name": "Parc des Princes",
"city": "Paris"
},
{
"name": "Vélodrome Municipal",
"city": "Reims"
},
{
"name": "Stade Gerland",
"city": "Lyon"
},
{
"name": "Stade du T.O.E.C.",
"city": "Toulouse"
},
{
"name": "Stade Olympique de Colombes",
"city": "Colombes"
},
{
"name": "Stade Vélodrome",
"city": "Marseille"
},
{
"name": "Stade de la Meinau",
"city": "Strasbourg"
},
{
"name": "Stade municipal",
"city": "Le Havre"
},
{
"name": "Stade Victor Boucquey",
"city": "Lille"
},
{
"name": "Stade du Fort Carré",
"city": "Antibes"
},
{
"name": "Parc Lescure",
"city": "Bordeaux"
}
]
}