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 => ( -
+
{s.label}
{s.value}
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 ( -
+
{match.isLive &&
}