diff --git a/app/globals.css b/app/globals.css
index 18c4300..4fad125 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -25,13 +25,44 @@
html { scroll-behavior: smooth; }
body {
- background: #040d08;
+ background-color: #040d08;
+ /* Diagonal goal-net pattern */
+ background-image:
+ repeating-linear-gradient(
+ -45deg,
+ rgba(34,197,94,0.028) 0, rgba(34,197,94,0.028) 1px,
+ transparent 1px, transparent 28px
+ ),
+ repeating-linear-gradient(
+ 45deg,
+ rgba(34,197,94,0.028) 0, rgba(34,197,94,0.028) 1px,
+ transparent 1px, transparent 28px
+ );
color: #dff5e8;
font-family: "Space Grotesk", system-ui, sans-serif;
min-height: 100vh;
overflow-x: hidden;
}
+ /* 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-radius: 1rem;
+ overflow: hidden;
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ }
+
+ .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-radius: 1rem;
+ overflow: hidden;
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ }
+
::-webkit-scrollbar { width: 5px; }
::-webkit-scrollbar-track { background: #020a04; }
::-webkit-scrollbar-thumb { background: rgba(34,197,94,0.25); border-radius: 4px; }
diff --git a/app/groups/page.tsx b/app/groups/page.tsx
index 3dd5f77..27ebe99 100644
--- a/app/groups/page.tsx
+++ b/app/groups/page.tsx
@@ -57,7 +57,7 @@ export default function GroupsPage() {
})
const letter = groupName.replace('Group ', '')
return (
-
+
-
+
{/* Year watermark */}
diff --git a/app/not-found.tsx b/app/not-found.tsx
index 286224c..1235733 100644
--- a/app/not-found.tsx
+++ b/app/not-found.tsx
@@ -7,11 +7,7 @@ export default function NotFound() {
return (
404
diff --git a/app/page.tsx b/app/page.tsx
index 1387567..1b3a9e5 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -58,8 +58,7 @@ function UpcomingFixture({ match }: { match: UpcomingMatch }) {
const time = match.time?.split(' ')[0] ?? ''
return (
-
+
{match.team1.name}
vs {match.team2.name}
@@ -102,7 +101,7 @@ export default function HomePage() {
{/* ── Hero ── */}
@@ -182,7 +181,7 @@ export default function HomePage() {
{scorers.length > 0 && (
-
+
{scorers.map((s, i) => (
{/* Hero */}
-
+
{player.team &&
}
@@ -94,7 +91,7 @@ export default function PlayerPage({ params }: { params: Promise<{ name: string
{ label: 'Penalties', value: player.penalties },
{ label: 'Tournaments', value: player.tournaments },
].map(item => (
-
+
{item.label}
{item.value}
@@ -102,7 +99,7 @@ export default function PlayerPage({ params }: { params: Promise<{ name: string
{player.ownGoals > 0 && (
-
+
Includes {player.ownGoals} own goal{player.ownGoals !== 1 ? 's' : ''}
)}
diff --git a/app/search/page.tsx b/app/search/page.tsx
index d440538..2175fcb 100644
--- a/app/search/page.tsx
+++ b/app/search/page.tsx
@@ -106,8 +106,7 @@ function SearchContent() {
{results.teams.map((t: { name: string; iso2?: string | null; slug: string; stats?: { appearances: number; titles: number } | null }) => (
-
+
{t.name}
@@ -129,8 +128,7 @@ function SearchContent() {
{results.players.map((p: { playerName: string; goals: number; tournaments: number; team?: { name: string; iso2?: string | null } | null }) => (
-
+
{p.team &&
}
{p.playerName}
@@ -151,8 +149,7 @@ function SearchContent() {
{results.tournaments.map((t: { year: number; host: string; winner?: string | null; totalGoals?: number | null; matchesCount?: number | null }) => (
-
+
{t.year}
{t.host}
{t.winner &&
{t.winner}
}
@@ -171,8 +168,7 @@ function SearchContent() {
{results.matches.map((m: SearchMatch) => (
-
+
{m.team1.name} vs {m.team2.name}
{m.scoreFt &&
{m.scoreFt[0]}–{m.scoreFt[1]}}
diff --git a/app/stats/page.tsx b/app/stats/page.tsx
index 8964f9b..37cd9ac 100644
--- a/app/stats/page.tsx
+++ b/app/stats/page.tsx
@@ -51,7 +51,7 @@ function SectionTitle({ children, icon: Icon }: { children: React.ReactNode; ico
function Card({ children, className = '' }: { children: React.ReactNode; className?: string }) {
return (
-
+
{children}
)
@@ -257,7 +257,7 @@ export default function StatsPage() {
Hat-Tricks
{hatTricks.map((h, i) => (
-
+
{h.team &&
}
@@ -287,7 +287,7 @@ export default function StatsPage() {
{ label: 'Decided by PSO', value: `${etStats.wentToPenalties} (${etStats.penaltiesPct}%)` },
{ label: 'Decided in 90min', value: etStats.totalKnockoutMatches - etStats.wentToExtraTime },
].map(s => (
-
+
diff --git a/app/teams/[slug]/page.tsx b/app/teams/[slug]/page.tsx
index b212092..292943f 100644
--- a/app/teams/[slug]/page.tsx
+++ b/app/teams/[slug]/page.tsx
@@ -91,10 +91,7 @@ export default function TeamPage({ params }: { params: Promise<{ slug: string }>
return (
{/* Hero */}
-
+
@@ -127,13 +124,13 @@ export default function TeamPage({ params }: { params: Promise<{ slug: string }>
{ label: 'Win %', value: `${s.winPct}%` },
{ label: 'Goals For', value: s.goalsFor },
].map(item => (
-
+
{item.label}
{item.value}
))}
-
+
TeamWD
@@ -162,8 +159,7 @@ export default function TeamPage({ params }: { params: Promise<{ slug: string }>
{years.map(year => (
+ className="font-['Bebas_Neue'] text-lg px-3 py-1 rounded-lg transition-colors text-[#6abf7a] bg-[rgba(4,18,8,0.78)] border border-[rgba(34,197,94,0.15)] hover:text-[#22c55e] hover:border-[rgba(34,197,94,0.4)] backdrop-blur-sm">
{year}
))}
@@ -184,7 +180,7 @@ export default function TeamPage({ params }: { params: Promise<{ slug: string }>
className="inline-block font-['Bebas_Neue'] text-[22px] text-[#22c55e] mb-2 hover:opacity-70 transition-opacity">
{year}
-
+
{yMatches.map((m, i) => {
const isHome = m.team1.name === team.name
const opponent = isHome ? m.team2 : m.team1
@@ -248,7 +244,7 @@ export default function TeamPage({ params }: { params: Promise<{ slug: string }>
{teamScorers.length > 0 && (
Top Scorers
-
+
{teamScorers.map((sc: { playerName: string; goals: number; penalties: number; tournaments: number }, i: number) => (
{/* Header */}
-
+
{liveMatches.length > 0 &&
}
@@ -185,7 +182,7 @@ export default function TournamentPage({ params }: { params: Promise<{ year: str
{groupName}
{/* Standings mini */}
-
+
{sorted.map((s, i) => (
TOP SCORERS
-
+
{t.topScorers?.map((s: { playerName: string; goals: number; penalties: number; team?: { name: string; iso2?: string | null; slug: string } | null }, i: number) => (
{t.thirdPlace && (
-
+
3rd Place
diff --git a/components/match-card.tsx b/components/match-card.tsx
index 74680d2..431ed39 100644
--- a/components/match-card.tsx
+++ b/components/match-card.tsx
@@ -32,7 +32,7 @@ export function MatchCard({ match, compact = false }: { match: Match; compact?:
if (compact) {
return (
-
+
{match.round}{match.group ? ` · ${match.group}` : ''} · {match.date ? formatDate(match.date) : ''}
@@ -80,7 +80,7 @@ export function MatchCard({ match, compact = false }: { match: Match; compact?:
const matchHref = `/tournaments/${match.year}#match-${match.id}`
return (
-