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
+40
View File
@@ -0,0 +1,40 @@
{
"groups": [
{
"name": "Group 1",
"teams": [
"England",
"Uruguay",
"France",
"Mexico"
]
},
{
"name": "Group 2",
"teams": [
"West Germany",
"Switzerland",
"Argentina",
"Spain"
]
},
{
"name": "Group 3",
"teams": [
"Brazil",
"Bulgaria",
"Portugal",
"Hungary"
]
},
{
"name": "Group 4",
"teams": [
"Soviet Union",
"North Korea",
"Italy",
"Chile"
]
}
]
}
+939
View File
@@ -0,0 +1,939 @@
{
"matches": [
{
"round": "Quarter-finals",
"date": "1966-07-23",
"time": "15:00",
"team1": "England",
"team2": "Argentina",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Hurst",
"minute": 78
}
],
"ground": "Wembley Stadium, London"
},
{
"round": "Quarter-finals",
"date": "1966-07-23",
"time": "15:00",
"team1": "West Germany",
"team2": "Uruguay",
"score": {
"ft": [
4,
0
]
},
"goals1": [
{
"name": "Haller",
"minute": 11
},
{
"name": "Haller",
"minute": 83
},
{
"name": "Beckenbauer",
"minute": 70
},
{
"name": "Seeler",
"minute": 75
}
],
"ground": "Hillsborough Stadium, Sheffield"
},
{
"round": "Quarter-finals",
"date": "1966-07-23",
"time": "15:00",
"team1": "Soviet Union",
"team2": "Hungary",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Chislenko",
"minute": 5
},
{
"name": "Porkuyan",
"minute": 46
}
],
"goals2": [
{
"name": "Bene",
"minute": 57
}
],
"ground": "Roker Park, Sunderland"
},
{
"round": "Quarter-finals",
"date": "1966-07-23",
"time": "15:00",
"team1": "Portugal",
"team2": "North Korea",
"score": {
"ft": [
5,
3
]
},
"goals1": [
{
"name": "Eusébio",
"minute": 27
},
{
"name": "Eusébio",
"minute": 43,
"penalty": true
},
{
"name": "Eusébio",
"minute": 56
},
{
"name": "Eusébio",
"minute": 59,
"penalty": true
},
{
"name": "José Augusto",
"minute": 80
}
],
"goals2": [
{
"name": "Pak Seung-zin",
"minute": 1
},
{
"name": "Li Dong-woon",
"minute": 22
},
{
"name": "Yang Seung-kook",
"minute": 25
}
],
"ground": "Goodison Park, Liverpool"
},
{
"round": "Semi-finals",
"date": "1966-07-25",
"time": "19:30",
"team1": "West Germany",
"team2": "Soviet Union",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Haller",
"minute": 43
},
{
"name": "Beckenbauer",
"minute": 67
}
],
"goals2": [
{
"name": "Porkuyan",
"minute": 88
}
],
"ground": "Goodison Park, Liverpool"
},
{
"round": "Semi-finals",
"date": "1966-07-26",
"time": "19:30",
"team1": "England",
"team2": "Portugal",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "B. Charlton",
"minute": 30
},
{
"name": "B. Charlton",
"minute": 80
}
],
"goals2": [
{
"name": "Eusébio",
"minute": 82,
"penalty": true
}
],
"ground": "Wembley Stadium, London"
},
{
"round": "Third-place match",
"date": "1966-07-28",
"time": "19:30",
"team1": "Portugal",
"team2": "Soviet Union",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Eusébio",
"minute": 12,
"penalty": true
},
{
"name": "Torres",
"minute": 89
}
],
"goals2": [
{
"name": "Malofeyev",
"minute": 43
}
],
"ground": "Wembley Stadium, London"
},
{
"round": "Final",
"date": "1966-07-30",
"time": "15:00",
"team1": "England",
"team2": "West Germany",
"score": {
"ft": [
2,
2
],
"et": [
4,
2
]
},
"goals1": [
{
"name": "Hurst",
"minute": 18
},
{
"name": "Hurst",
"minute": 101
},
{
"name": "Hurst",
"minute": 120
},
{
"name": "Peters",
"minute": 78
}
],
"goals2": [
{
"name": "Haller",
"minute": 12
},
{
"name": "Weber",
"minute": 89
}
],
"ground": "Wembley Stadium, London"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1966-07-11",
"time": "19:30",
"team1": "England",
"team2": "Uruguay",
"score": {
"ft": [
0,
0
]
},
"ground": "Wembley Stadium, London"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1966-07-13",
"time": "19:30",
"team1": "France",
"team2": "Mexico",
"score": {
"ft": [
1,
1
]
},
"goals1": [
{
"name": "Hausser",
"minute": 62
}
],
"goals2": [
{
"name": "Borja",
"minute": 48
}
],
"ground": "Wembley Stadium, London"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1966-07-15",
"time": "19:30",
"team1": "Uruguay",
"team2": "France",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Rocha",
"minute": 26
},
{
"name": "Cortés",
"minute": 31
}
],
"goals2": [
{
"name": "De Bourgoing",
"minute": 15,
"penalty": true
}
],
"ground": "White City Stadium, London"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1966-07-16",
"time": "19:30",
"team1": "England",
"team2": "Mexico",
"score": {
"ft": [
2,
0
]
},
"goals1": [
{
"name": "B. Charlton",
"minute": 37
},
{
"name": "Hunt",
"minute": 75
}
],
"ground": "Wembley Stadium, London"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1966-07-19",
"time": "16:30",
"team1": "Mexico",
"team2": "Uruguay",
"score": {
"ft": [
0,
0
]
},
"ground": "Wembley Stadium, London"
},
{
"round": "Group stage",
"group": "Group 1",
"date": "1966-07-20",
"time": "19:30",
"team1": "England",
"team2": "France",
"score": {
"ft": [
2,
0
]
},
"goals1": [
{
"name": "Hunt",
"minute": 38
},
{
"name": "Hunt",
"minute": 75
}
],
"ground": "Wembley Stadium, London"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1966-07-12",
"time": "19:30",
"team1": "West Germany",
"team2": "Switzerland",
"score": {
"ft": [
5,
0
]
},
"goals1": [
{
"name": "Held",
"minute": 16
},
{
"name": "Haller",
"minute": 21
},
{
"name": "Haller",
"minute": 77,
"penalty": true
},
{
"name": "Beckenbauer",
"minute": 40
},
{
"name": "Beckenbauer",
"minute": 52
}
],
"ground": "Hillsborough Stadium, Sheffield"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1966-07-13",
"time": "19:30",
"team1": "Argentina",
"team2": "Spain",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Artime",
"minute": 66
},
{
"name": "Artime",
"minute": 79
}
],
"goals2": [
{
"name": "Roma",
"minute": 72,
"owngoal": true
}
],
"ground": "Villa Park, Birmingham"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1966-07-15",
"time": "19:30",
"team1": "Spain",
"team2": "Switzerland",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Sanchís",
"minute": 57
},
{
"name": "Amancio",
"minute": 75
}
],
"goals2": [
{
"name": "Quentin",
"minute": 31
}
],
"ground": "Hillsborough Stadium, Sheffield"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1966-07-16",
"time": "15:00",
"team1": "Argentina",
"team2": "West Germany",
"score": {
"ft": [
0,
0
]
},
"ground": "Villa Park, Birmingham"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1966-07-19",
"time": "19:30",
"team1": "Argentina",
"team2": "Switzerland",
"score": {
"ft": [
2,
0
]
},
"goals1": [
{
"name": "Artime",
"minute": 52
},
{
"name": "Onega",
"minute": 79
}
],
"ground": "Hillsborough Stadium, Sheffield"
},
{
"round": "Group stage",
"group": "Group 2",
"date": "1966-07-20",
"time": "19:30",
"team1": "West Germany",
"team2": "Spain",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Emmerich",
"minute": 39
},
{
"name": "Seeler",
"minute": 84
}
],
"goals2": [
{
"name": "Fusté",
"minute": 23
}
],
"ground": "Villa Park, Birmingham"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1966-07-12",
"time": "19:30",
"team1": "Brazil",
"team2": "Bulgaria",
"score": {
"ft": [
2,
0
]
},
"goals1": [
{
"name": "Pelé",
"minute": 15
},
{
"name": "Garrincha",
"minute": 63
}
],
"ground": "Goodison Park, Liverpool"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1966-07-13",
"time": "19:30",
"team1": "Portugal",
"team2": "Hungary",
"score": {
"ft": [
3,
1
]
},
"goals1": [
{
"name": "José Augusto",
"minute": 2
},
{
"name": "José Augusto",
"minute": 67
},
{
"name": "Torres",
"minute": 90
}
],
"goals2": [
{
"name": "Bene",
"minute": 60
}
],
"ground": "Old Trafford, Manchester"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1966-07-15",
"time": "19:30",
"team1": "Hungary",
"team2": "Brazil",
"score": {
"ft": [
3,
1
]
},
"goals1": [
{
"name": "Bene",
"minute": 2
},
{
"name": "Farkas",
"minute": 64
},
{
"name": "Mészöly",
"minute": 73,
"penalty": true
}
],
"goals2": [
{
"name": "Tostão",
"minute": 14
}
],
"ground": "Goodison Park, Liverpool"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1966-07-16",
"time": "15:00",
"team1": "Portugal",
"team2": "Bulgaria",
"score": {
"ft": [
3,
0
]
},
"goals1": [
{
"name": "Vutsov",
"minute": 7,
"owngoal": true
},
{
"name": "Eusébio",
"minute": 38
},
{
"name": "Torres",
"minute": 81
}
],
"ground": "Old Trafford, Manchester"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1966-07-19",
"time": "19:30",
"team1": "Portugal",
"team2": "Brazil",
"score": {
"ft": [
3,
1
]
},
"goals1": [
{
"name": "Simões",
"minute": 15
},
{
"name": "Eusébio",
"minute": 27
},
{
"name": "Eusébio",
"minute": 85
}
],
"goals2": [
{
"name": "Rildo",
"minute": 73
}
],
"ground": "Goodison Park, Liverpool"
},
{
"round": "Group stage",
"group": "Group 3",
"date": "1966-07-20",
"time": "19:30",
"team1": "Hungary",
"team2": "Bulgaria",
"score": {
"ft": [
3,
1
]
},
"goals1": [
{
"name": "Davidov",
"minute": 43,
"owngoal": true
},
{
"name": "Mészöly",
"minute": 45
},
{
"name": "Bene",
"minute": 54
}
],
"goals2": [
{
"name": "Asparuhov",
"minute": 15
}
],
"ground": "Old Trafford, Manchester"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1966-07-12",
"time": "19:30",
"team1": "Soviet Union",
"team2": "North Korea",
"score": {
"ft": [
3,
0
]
},
"goals1": [
{
"name": "Malofeyev",
"minute": 31
},
{
"name": "Malofeyev",
"minute": 88
},
{
"name": "Banishevskiy",
"minute": 33
}
],
"ground": "Ayresome Park, Middlesbrough"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1966-07-13",
"time": "19:30",
"team1": "Italy",
"team2": "Chile",
"score": {
"ft": [
2,
0
]
},
"goals1": [
{
"name": "Mazzola",
"minute": 8
},
{
"name": "Barison",
"minute": 88
}
],
"ground": "Roker Park, Sunderland"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1966-07-15",
"time": "19:30",
"team1": "Chile",
"team2": "North Korea",
"score": {
"ft": [
1,
1
]
},
"goals1": [
{
"name": "Marcos",
"minute": 26,
"penalty": true
}
],
"goals2": [
{
"name": "Pak Seung-zin",
"minute": 88
}
],
"ground": "Ayresome Park, Middlesbrough"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1966-07-16",
"time": "15:00",
"team1": "Soviet Union",
"team2": "Italy",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Chislenko",
"minute": 57
}
],
"ground": "Roker Park, Sunderland"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1966-07-19",
"time": "19:30",
"team1": "North Korea",
"team2": "Italy",
"score": {
"ft": [
1,
0
]
},
"goals1": [
{
"name": "Pak Doo-ik",
"minute": 42
}
],
"ground": "Ayresome Park, Middlesbrough"
},
{
"round": "Group stage",
"group": "Group 4",
"date": "1966-07-20",
"time": "19:30",
"team1": "Soviet Union",
"team2": "Chile",
"score": {
"ft": [
2,
1
]
},
"goals1": [
{
"name": "Porkuyan",
"minute": 28
},
{
"name": "Porkuyan",
"minute": 85
}
],
"goals2": [
{
"name": "Marcos",
"minute": 32
}
],
"ground": "Roker Park, Sunderland"
}
]
}
+8
View File
@@ -0,0 +1,8 @@
{
"host": "England",
"teams_count": 16,
"winner": "England",
"runner_up": "West Germany",
"third_place": "Portugal",
"fourth_place": "Soviet Union"
}
File diff suppressed because it is too large Load Diff
+36
View File
@@ -0,0 +1,36 @@
{
"stadiums": [
{
"name": "Wembley Stadium",
"city": "London"
},
{
"name": "Hillsborough Stadium",
"city": "Sheffield"
},
{
"name": "Roker Park",
"city": "Sunderland"
},
{
"name": "Goodison Park",
"city": "Liverpool"
},
{
"name": "White City Stadium",
"city": "London"
},
{
"name": "Villa Park",
"city": "Birmingham"
},
{
"name": "Old Trafford",
"city": "Manchester"
},
{
"name": "Ayresome Park",
"city": "Middlesbrough"
}
]
}