diff --git a/Dockerfile b/Dockerfile
index da3ce7c..13c227a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -22,7 +22,7 @@ COPY --from=builder /app/scripts ./scripts
COPY --from=builder /app/lib ./lib
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/tsconfig.json ./tsconfig.json
-COPY --from=builder /app/app/data ./app/data
+COPY --from=builder /app/data ./data
USER nextjs
EXPOSE 3000
ENV PORT=3000 HOSTNAME="0.0.0.0"
diff --git a/app/data/world_cup.csv b/app/data/world_cup.csv
deleted file mode 100644
index 98148e0..0000000
--- a/app/data/world_cup.csv
+++ /dev/null
@@ -1,23 +0,0 @@
-Year,Host,Teams,Champion,Runner-Up,TopScorrer,Attendance,AttendanceAvg,Matches
-2022,Qatar,32,Argentina,France,Kylian Mbappé - 8,3404252,53191,64
-2018,Russia,32,France,Croatia,Harry Kane - 6,3031768,47371,64
-2014,Brazil,32,Germany,Argentina,James Rodríguez - 6,3429873,53592,64
-2010,South Africa,32,Spain,Netherlands,"Wesley Sneijder, Thomas Müller... - 5",3178856,49670,64
-2006,Germany,32,Italy,France,Miroslav Klose - 5,3352605,52384,64
-2002,"Korea Republic, Japan",32,Brazil,Germany,Ronaldo - 8,2705337,42271,64
-1998,France,32,France,Brazil,Davor Šuker - 6,2903477,45367,64
-1994,United States,24,Brazil,Italy,"Hristo Stoichkov, Oleg Salenko - 6",3587538,68991,52
-1990,Italy,24,West Germany,Argentina,Salvatore Schillaci - 6,2516215,48389,52
-1986,Mexico,24,Argentina,West Germany,Gary Lineker - 6,2394031,46039,52
-1982,Spain,24,Italy,West Germany,Paolo Rossi - 6,2109723,40572,52
-1978,Argentina,16,Argentina,Netherlands,Mario Kempes - 6,1545791,40679,38
-1974,Germany,16,West Germany,Netherlands,Grzegorz Lato - 7,1865753,49099,38
-1970,Mexico,16,Brazil,Italy,Gerd Müller - 10,1603975,50124,32
-1966,England,16,England,West Germany,Eusébio - 9,1563135,48848,32
-1962,Chile,16,Brazil,Czechoslovakia,"Leonel Sánchez, Flórián Albert... - 4",893172,27912,32
-1958,Sweden,16,Brazil,Sweden,Just Fontaine - 13,819810,23423,35
-1954,Switzerland,16,Germany,Hungary,Sándor Kocsis - 11,768607,29562,26
-1950,Brazil,15,Uruguay,Brazil,Ademir - 8,1045246,47511,22
-1938,France,16,Italy,Hungary,Leônidas - 7,375700,20872,18
-1934,Italy,16,Italy,Czechoslovakia,Oldřich Nejedlý - 5,363000,21353,17
-1930,Uruguay,13,Uruguay,Argentina,Guillermo Stábile - 8,590549,32808,18
diff --git a/app/globals.css b/app/globals.css
index 4fad125..9034a3d 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -12,6 +12,7 @@
--color-green-sec: #6abf7a;
--color-green-muted: #2a5c35;
--color-green-dark: #1a3a22;
+ --color-green-mid: #4a7a55;
--color-text: #dff5e8;
--color-border: rgba(34,197,94,0.15);
@@ -25,7 +26,7 @@
html { scroll-behavior: smooth; }
body {
- background-color: #040d08;
+ background-color: var(--color-bg);
/* Diagonal goal-net pattern */
background-image:
repeating-linear-gradient(
@@ -38,7 +39,7 @@
rgba(34,197,94,0.028) 0, rgba(34,197,94,0.028) 1px,
transparent 1px, transparent 28px
);
- color: #dff5e8;
+ color: var(--color-text);
font-family: "Space Grotesk", system-ui, sans-serif;
min-height: 100vh;
overflow-x: hidden;
@@ -47,7 +48,7 @@
/* Glass card — semi-transparent over the body net pattern */
.glass-card {
background: rgba(4, 18, 8, 0.78);
- border: 1px solid rgba(34,197,94,0.15);
+ border: 1px solid var(--color-border);
border-radius: 1rem;
overflow: hidden;
backdrop-filter: blur(10px);
@@ -56,7 +57,7 @@
.glass-card-hero {
background: linear-gradient(145deg, rgba(13,32,22,0.82), rgba(16,42,28,0.82));
- border: 1px solid rgba(34,197,94,0.28);
+ border: 1px solid color-mix(in srgb, var(--color-green) 28%, transparent);
border-radius: 1rem;
overflow: hidden;
backdrop-filter: blur(10px);
@@ -65,7 +66,7 @@
::-webkit-scrollbar { width: 5px; }
::-webkit-scrollbar-track { background: #020a04; }
- ::-webkit-scrollbar-thumb { background: rgba(34,197,94,0.25); border-radius: 4px; }
+ ::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--color-green) 25%, transparent); border-radius: 4px; }
@keyframes livePulse {
0%, 100% { opacity: 1; transform: scale(1); }
diff --git a/app/groups/page.tsx b/app/groups/page.tsx
index 27ebe99..20d2592 100644
--- a/app/groups/page.tsx
+++ b/app/groups/page.tsx
@@ -36,14 +36,14 @@ export default function GroupsPage() {
return (
-
2026 Groups
-
48 teams · 12 groups · Top 2 + 8 best 3rd-place advance
+
2026 Groups
+
48 teams · 12 groups · Top 2 + 8 best 3rd-place advance
{loading && !data && (
{Array.from({ length: 12 }).map((_, i) => (
-
+
))}
)}
@@ -58,13 +58,11 @@ export default function GroupsPage() {
const letter = groupName.replace('Group ', '')
return (
-
-
GROUP {letter}
+
+ GROUP {letter}
-
Team
PW
@@ -73,24 +71,19 @@ export default function GroupsPage() {
{sorted.map((t, idx) => (
-
+
- {t.team.name}
+ {t.team.name}
{[t.played, t.won, t.drawn, t.lost].map((v, i) => (
-
{v}
+
{v}
))}
-
+
{t.goalDiff > 0 ? `+${t.goalDiff}` : t.goalDiff}
- {t.pts}
+ {t.pts}
))}
diff --git a/app/history/page.tsx b/app/history/page.tsx
index b4edfc4..d94cfa7 100644
--- a/app/history/page.tsx
+++ b/app/history/page.tsx
@@ -33,17 +33,17 @@ export default function HistoryPage() {
return (
-
+
World Cup History
-
+
Every edition — Uruguay 1930 through 2026 · {tournaments.length} tournaments
{loading && !data && (
{Array.from({ length: 24 }).map((_, i) => (
-
+
))}
)}
@@ -54,52 +54,50 @@ export default function HistoryPage() {
const topScorer = t.topScorers?.[0]
return (
-
+
{/* Year watermark */}
-
+
{t.year}
-
{t.year}
-
{inProgress
- ?
+ ?
IN PROGRESS
: t.winner && (
-
{t.winner}
+
{t.winner}
)}
{!inProgress && t.winner && t.runnerUp && (
-
-
{t.winner}
-
def.
+
+ {t.winner}
+ def.
{t.runnerUp}
)}
-
+
{t.totalGoals != null && {t.totalGoals}}
{t.matchesCount != null && {t.matchesCount} games}
{t.teamsCount != null && 🏳 {t.teamsCount} teams}
{topScorer && (
-
- Golden Boot:
{topScorer.playerName} ({topScorer.goals})
+
+ Golden Boot: {topScorer.playerName} ({topScorer.goals})
)}
diff --git a/app/layout.tsx b/app/layout.tsx
index b715a64..5c1802a 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -35,11 +35,11 @@ export default function RootLayout({ children }: { children: React.ReactNode })
{children}
-