Why This Is the Last World Cup for These Football Legends
Sports Live•May 31, 2026

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="FIFA World Cup 2026 Complete Hub — Live Scores, Player Rankings, Match Schedule, 120 Football Articles. Your #1 World Cup destination.">
<meta name="keywords" content="FIFA World Cup 2026, football, live scores, player rankings, schedule, Messi, Mbappe, Ronaldo, World Cup groups, World Cup schedule">
<meta property="og:title" content="FIFA World Cup 2026 Complete Hub | SportsLNV">
<meta property="og:description" content="120 articles, live scores, player rankings & full match schedule in one place.">
<title>FIFA World Cup 2026 Complete Hub | SportsLNV</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Barlow:wght@400;500;600;700&family=Barlow+Condensed:wght@600;700;800&display=swap" rel="stylesheet">
<style>
/* ============================================================
RESET & ROOT
============================================================ */
*, *::before, *::after { margin:0; padding:0; box-sizing:border-box; }
:root {
--bg: #080c14;
--bg2: #0d1320;
--bg3: #111827;
--card: #131c2e;
--card2: #1a2540;
--border: rgba(255,255,255,0.08);
--border2: rgba(255,255,255,0.14);
--gold: #F5A623;
--gold2: #ffcc66;
--red: #E8293A;
--blue: #2563EB;
--cyan: #06B6D4;
--green: #22C55E;
--purple: #8B5CF6;
--text: #F1F5F9;
--text2: #94A3B8;
--text3: #64748B;
--r: 12px;
--r2: 8px;
--shadow: 0 4px 24px rgba(0,0,0,0.5);
--glow-gold: 0 0 30px rgba(245,166,35,0.3);
--glow-red: 0 0 30px rgba(232,41,58,0.25);
}
html { scroll-behavior: smooth; }
body {
font-family: 'Barlow', sans-serif;
background: var(--bg);
color: var(--text);
min-height: 100vh;
overflow-x: hidden;
}
/* ============================================================
SCROLLBAR
============================================================ */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: var(--bg); }
::-webkit-scrollbar-thumb { background: var(--card2); border-radius: 3px; }
/* ============================================================
BACKGROUND GRID
============================================================ */
body::before {
content: '';
position: fixed;
inset: 0;
background-image:
linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
background-size: 40px 40px;
pointer-events: none;
z-index: 0;
}
/* ============================================================
NAV
============================================================ */
nav {
position: sticky;
top: 0;
z-index: 100;
background: rgba(8,12,20,0.92);
backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
padding: 0 20px;
}
.nav-inner {
max-width: 1280px;
margin: 0 auto;
display: flex;
align-items: center;
gap: 12px;
height: 54px;
}
.nav-logo {
font-family: 'Bebas Neue', sans-serif;
font-size: 22px;
color: var(--gold);
letter-spacing: 2px;
text-decoration: none;
margin-right: 8px;
flex-shrink: 0;
}
.nav-logo span { color: var(--text); }
.nav-tabs {
display: flex;
gap: 2px;
overflow-x: auto;
scrollbar-width: none;
flex: 1;
}
.nav-tabs::-webkit-scrollbar { display: none; }
.nav-tab {
padding: 6px 14px;
border-radius: 6px;
font-size: 13px;
font-weight: 500;
color: var(--text2);
cursor: pointer;
white-space: nowrap;
border: none;
background: transparent;
transition: all 0.15s;
font-family: 'Barlow', sans-serif;
}
.nav-tab:hover { background: rgba(255,255,255,0.06); color: var(--text); }
.nav-tab.active { background: rgba(245,166,35,0.12); color: var(--gold); }
.live-pill {
display: flex;
align-items: center;
gap: 5px;
font-size: 11px;
font-weight: 600;
color: var(--red);
background: rgba(232,41,58,0.1);
border: 1px solid rgba(232,41,58,0.25);
padding: 4px 10px;
border-radius: 20px;
white-space: nowrap;
flex-shrink: 0;
}
.live-dot {
width: 6px; height: 6px;
background: var(--red);
border-radius: 50%;
animation: blink 1.2s infinite;
}
@keyframes blink {
0%,100% { opacity:1; }
50% { opacity:0.2; }
}
/* ============================================================
WRAPPER
============================================================ */
.wrapper {
max-width: 1280px;
margin: 0 auto;
padding: 0 20px 60px;
position: relative;
z-index: 1;
}
/* ============================================================
HERO
============================================================ */
.hero {
position: relative;
overflow: hidden;
border-radius: 20px;
margin: 20px 0 24px;
background: linear-gradient(135deg, #0a1628 0%, #0f0e2a 40%, #0a1e14 100%);
border: 1px solid rgba(245,166,35,0.2);
padding: 48px 40px 36px;
perspective: 800px;
}
.hero-bg-orb1 {
position: absolute;
width: 500px; height: 500px;
border-radius: 50%;
background: radial-gradient(circle, rgba(245,166,35,0.12), transparent 70%);
top: -200px; right: -100px;
pointer-events: none;
}
.hero-bg-orb2 {
position: absolute;
width: 400px; height: 400px;
border-radius: 50%;
background: radial-gradient(circle, rgba(34,197,94,0.08), transparent 70%);
bottom: -150px; left: -100px;
pointer-events: none;
}
.hero-bg-lines {
position: absolute;
inset: 0;
background-image:
repeating-linear-gradient(45deg, transparent, transparent 40px, rgba(255,255,255,0.012) 40px, rgba(255,255,255,0.012) 41px);
pointer-events: none;
}
.hero-badge {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 11px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
color: var(--gold);
background: rgba(245,166,35,0.1);
border: 1px solid rgba(245,166,35,0.3);
padding: 5px 14px;
border-radius: 20px;
margin-bottom: 18px;
}
.hero-title {
font-family: 'Bebas Neue', sans-serif;
font-size: clamp(48px, 8vw, 88px);
letter-spacing: 4px;
line-height: 0.9;
color: #fff;
margin-bottom: 6px;
position: relative;
z-index: 1;
}
.hero-title .hl { color: var(--gold); }
.hero-sub {
font-size: 15px;
color: rgba(255,255,255,0.5);
margin-bottom: 28px;
max-width: 520px;
line-height: 1.5;
}
.hero-stats {
display: flex;
gap: 28px;
flex-wrap: wrap;
}
.hstat {
display: flex;
flex-direction: column;
}
.hstat-num {
font-family: 'Bebas Neue', sans-serif;
font-size: 36px;
color: var(--gold);
line-height: 1;
}
.hstat-lbl {
font-size: 11px;
color: rgba(255,255,255,0.4);
text-transform: uppercase;
letter-spacing: 1px;
margin-top: 2px;
}
.hero-3d-ball {
position: absolute;
right: 40px;
top: 50%;
transform: translateY(-50%);
width: 140px; height: 140px;
border-radius: 50%;
background: radial-gradient(circle at 35% 35%, #fff 0%, #e0e0e0 30%, #999 70%, #333 100%);
box-shadow:
inset -15px -15px 30px rgba(0,0,0,0.7),
inset 10px 10px 20px rgba(255,255,255,0.4),
0 0 60px rgba(245,166,35,0.4),
0 20px 40px rgba(0,0,0,0.6);
animation: float 4s ease-in-out infinite;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.hero-3d-ball::before {
content: '';
position: absolute;
inset: 0;
border-radius: 50%;
background:
radial-gradient(ellipse at 50% 50%, transparent 40%, rgba(0,0,0,0.3) 100%);
}
.hero-3d-ball::after {
content: '';
position: absolute;
width: 60%; height: 3px;
background: rgba(0,0,0,0.4);
border-radius: 50%;
top: 48%; left: 50%;
transform: translateX(-50%);
}
@keyframes float {
0%,100% { transform: translateY(-50%) rotate(0deg); }
50% { transform: translateY(calc(-50% - 12px)) rotate(8deg); }
}
/* ============================================================
LIVE SCORES BAR
============================================================ */
.scores-bar {
background: var(--card);
border: 1px solid rgba(232,41,58,0.25);
border-radius: var(--r);
padding: 12px 16px;
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 24px;
overflow-x: auto;
scrollbar-width: none;
}
.scores-bar::-webkit-scrollbar { display: none; }
.scores-label {
font-size: 11px;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
color: var(--red);
display: flex;
align-items: center;
gap: 5px;
white-space: nowrap;
flex-shrink: 0;
}
.score-chips {
display: flex;
gap: 8px;
flex: 1;
overflow-x: auto;
scrollbar-width: none;
}
.score-chips::-webkit-scrollbar { display: none; }
.score-chip {
background: rgba(255,255,255,0.04);
border: 1px solid var(--border);
border-radius: 20px;
padding: 5px 14px;
font-size: 12px;
font-weight: 600;
color: var(--text);
white-space: nowrap;
cursor: pointer;
transition: border-color 0.15s;
}
.score-chip:hover { border-color: var(--border2); }
.score-chip .mins { font-size: 10px; color: var(--red); margin-left: 4px; font-weight: 700; }
.score-chip .ft { font-size: 10px; color: var(--text3); margin-left: 4px; }
/* ============================================================
SECTION HEADER
============================================================ */
.sec-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
gap: 12px;
}
.sec-title {
font-family: 'Barlow Condensed', sans-serif;
font-size: 22px;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
color: var(--text);
display: flex;
align-items: center;
gap: 10px;
}
.sec-title::before {
content: '';
width: 4px; height: 22px;
background: var(--gold);
border-radius: 2px;
}
.sec-badge {
font-size: 11px;
font-weight: 600;
padding: 3px 10px;
border-radius: 20px;
background: rgba(245,166,35,0.1);
color: var(--gold);
border: 1px solid rgba(245,166,35,0.25);
}
.sec-count {
font-size: 12px;
color: var(--text3);
margin-left: auto;
}
/* ============================================================
FILTER ROW
============================================================ */
.filter-row {
display: flex;
gap: 6px;
margin-bottom: 16px;
flex-wrap: wrap;
align-items: center;
}
.filter-btn {
padding: 6px 16px;
border-radius: 20px;
border: 1px solid var(--border);
background: transparent;
color: var(--text2);
font-size: 12px;
font-family: 'Barlow', sans-serif;
font-weight: 500;
cursor: pointer;
transition: all 0.12s;
}
.filter-btn:hover { border-color: var(--border2); color: var(--text); }
.filter-btn.active { background: rgba(245,166,35,0.1); color: var(--gold); border-color: rgba(245,166,35,0.35); }
.search-box {
background: var(--card);
border: 1px solid var(--border);
border-radius: 20px;
padding: 6px 14px;
font-size: 12px;
font-family: 'Barlow', sans-serif;
color: var(--text);
outline: none;
width: 180px;
transition: border-color 0.15s;
}
.search-box::placeholder { color: var(--text3); }
.search-box:focus { border-color: rgba(245,166,35,0.4); }
/* ============================================================
ARTICLE CARDS GRID
============================================================ */
.articles-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 10px;
margin-bottom: 16px;
}
.art-card {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--r);
padding: 14px;
cursor: pointer;
transition: transform 0.15s, border-color 0.15s, box-shadow 0.15s;
position: relative;
overflow: hidden;
text-decoration: none;
display: block;
}
.art-card:hover {
transform: translateY(-2px);
border-color: var(--border2);
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
}
.art-card::before {
content: '';
position: absolute;
left: 0; top: 0; bottom: 0;
width: 3px;
border-radius: 3px 0 0 3px;
}
.t1::before { background: var(--red); }
.t2::before { background: var(--gold); }
.t3::before { background: var(--blue); }
.t4::before { background: var(--green); }
.art-card:hover::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(255,255,255,0.02), transparent);
pointer-events: none;
}
.art-num {
font-size: 11px;
font-weight: 600;
color: var(--text3);
margin-bottom: 6px;
letter-spacing: 0.5px;
}
.art-title {
font-size: 13px;
font-weight: 600;
color: var(--text);
line-height: 1.45;
margin-bottom: 10px;
}
.art-tags {
display: flex;
gap: 5px;
flex-wrap: wrap;
margin-bottom: 8px;
}
.tag {
font-size: 10px;
font-weight: 600;
padding: 2px 8px;
border-radius: 10px;
letter-spacing: 0.3px;
}
.tag-v { background: rgba(232,41,58,0.12); color: #ff6b78; }
.tag-w { background: rgba(245,166,35,0.12); color: var(--gold); }
.tag-p { background: rgba(37,99,235,0.15); color: #60a5fa; }
.tag-g { background: rgba(34,197,94,0.12); color: #4ade80; }
.tag-a { background: rgba(139,92,246,0.12); color: #a78bfa; }
.tag-f { background: rgba(6,182,212,0.12); color: #22d3ee; }
.traffic-bar {
height: 3px;
background: rgba(255,255,255,0.06);
border-radius: 2px;
overflow: hidden;
}
.traffic-fill {
height: 100%;
border-radius: 2px;
background: linear-gradient(90deg, var(--gold), var(--red));
transition: width 0.4s ease;
}
/* TIER LEGEND */
.tier-legend {
display: flex;
gap: 16px;
margin-bottom: 14px;
flex-wrap: wrap;
}
.tl-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
color: var(--text2);
}
.tl-dot {
width: 10px; height: 10px;
border-radius: 2px;
}
/* ============================================================
PAGINATION
============================================================ */
.pagination {
display: flex;
gap: 4px;
justify-content: center;
flex-wrap: wrap;
padding: 8px 0;
}
.pg-btn {
width: 34px; height: 34px;
display: flex; align-items: center; justify-content: center;
border-radius: 8px;
border: 1px solid var(--border);
background: var(--card);
color: var(--text2);
font-size: 12px;
font-weight: 600;
font-family: 'Barlow', sans-serif;
cursor: pointer;
transition: all 0.12s;
}
.pg-btn:hover { background: var(--card2); color: var(--text); border-color: var(--border2); }
.pg-btn.active { background: rgba(245,166,35,0.15); color: var(--gold); border-color: rgba(245,166,35,0.4); }
.pg-btn:disabled { opacity:0.3; cursor:not-allowed; }
/* ============================================================
PLAYER RANKINGS
============================================================ */
.players-section { margin-bottom: 40px; }
.players-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
gap: 10px;
}
.player-card {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--r);
padding: 18px 14px 14px;
text-align: center;
cursor: pointer;
transition: transform 0.18s, box-shadow 0.18s, border-color 0.18s;
position: relative;
overflow: hidden;
}
.player-card::before {
content: '';
position: absolute;
inset: 0;
opacity: 0;
transition: opacity 0.2s;
background: radial-gradient(circle at 50% 0%, rgba(245,166,35,0.08), transparent 60%);
}
.player-card:hover {
transform: translateY(-4px) scale(1.01);
border-color: rgba(245,166,35,0.35);
box-shadow: 0 12px 32px rgba(0,0,0,0.5), 0 0 20px rgba(245,166,35,0.1);
}
.player-card:hover::before { opacity:1; }
/* 3D rank number */
.p-rank {
font-family: 'Bebas Neue', sans-serif;
font-size: 14px;
letter-spacing: 1px;
margin-bottom: 10px;
position: relative;
z-index: 1;
}
.p-rank.r1 { color: var(--gold); text-shadow: 0 0 12px rgba(245,166,35,0.6); font-size: 16px; }
.p-rank.r2 { color: #C0C0C0; }
.p-rank.r3 { color: #CD7F32; }
.p-rank.rn { color: var(--text3); }
.p-avatar {
width: 56px; height: 56px;
border-radius: 50%;
margin: 0 auto 8px;
display: flex; align-items: center; justify-content: center;
font-size: 20px;
font-weight: 700;
color: rgba(255,255,255,0.9);
border: 2px solid rgba(255,255,255,0.1);
position: relative;
z-index: 1;
/* 3D sphere effect */
box-shadow: inset -4px -4px 12px rgba(0,0,0,0.4), inset 2px 2px 8px rgba(255,255,255,0.15);
}
.p-name {
font-size: 13px;
font-weight: 700;
color: var(--text);
margin-bottom: 3px;
position: relative;
z-index: 1;
}
.p-nat {
font-size: 11px;
color: var(--text3);
margin-bottom: 10px;
}
.p-pos-badge {
font-size: 10px;
font-weight: 600;
padding: 2px 8px;
border-radius: 10px;
background: rgba(255,255,255,0.06);
color: var(--text2);
display: inline-block;
margin-bottom: 10px;
}
.p-stats {
display: flex;
justify-content: space-between;
border-top: 1px solid var(--border);
padding-top: 10px;
}
.p-stat-item { text-align: center; }
.p-stat-val {
font-family: 'Barlow Condensed', sans-serif;
font-size: 20px;
font-weight: 700;
color: var(--text);
line-height: 1;
}
.p-stat-lbl {
font-size: 9px;
color: var(--text3);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 2px;
}
/* ============================================================
MATCH SCHEDULE
============================================================ */
.schedule-section { margin-bottom: 40px; }
.schedule-wrap { overflow-x: auto; border-radius: var(--r); border: 1px solid var(--border); }
table {
width: 100%;
border-collapse: collapse;
min-width: 700px;
}
thead tr {
background: rgba(255,255,255,0.04);
border-bottom: 1px solid var(--border);
}
thead th {
padding: 10px 14px;
font-size: 11px;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
color: var(--text3);
text-align: left;
}
tbody tr {
border-bottom: 1px solid var(--border);
transition: background 0.12s;
cursor: pointer;
}
tbody tr:last-child { border-bottom: none; }
tbody tr:hover { background: rgba(255,255,255,0.03); }
tbody td {
padding: 11px 14px;
font-size: 13px;
color: var(--text);
vertical-align: middle;
}
.td-num { color: var(--text3); font-size: 11px; }
.td-date { white-space: nowrap; font-weight: 600; color: var(--gold); font-size: 12px; }
.td-time { white-space: nowrap; color: var(--text2); font-size: 12px; }
.match-name {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
}
.vs-tag {
font-size: 10px;
font-weight: 700;
color: var(--text3);
background: rgba(255,255,255,0.05);
padding: 2px 6px;
border-radius: 4px;
}
.stage-pill {
display: inline-block;
font-size: 10px;
font-weight: 700;
padding: 3px 9px;
border-radius: 10px;
letter-spacing: 0.3px;
white-space: nowrap;
}
.sg { background: rgba(37,99,235,0.15); color: #60a5fa; border: 1px solid rgba(37,99,235,0.2); }
.r16 { background: rgba(245,166,35,0.12); color: var(--gold); border: 1px solid rgba(245,166,35,0.2); }
.qf { background: rgba(232,41,58,0.12); color: #ff6b78; border: 1px solid rgba(232,41,58,0.2); }
.sf { background: rgba(139,92,246,0.12); color: #a78bfa; border: 1px solid rgba(139,92,246,0.2); }
.fn { background: rgba(245,166,35,0.2); color: var(--gold); border: 1px solid rgba(245,166,35,0.4); font-size: 11px; }
.venue-cell { font-size: 11px; color: var(--text3); max-width: 180px; }
/* ============================================================
GROUPS
============================================================ */
.groups-section { margin-bottom: 40px; }
.groups-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 12px;
}
.group-card {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--r);
overflow: hidden;
}
.group-head {
background: rgba(255,255,255,0.04);
padding: 10px 14px;
font-family: 'Barlow Condensed', sans-serif;
font-size: 15px;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
color: var(--gold);
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
gap: 8px;
}
.group-head::before {
content: '';
width: 3px; height: 14px;
background: var(--gold);
border-radius: 2px;
}
.group-table { width: 100%; border-collapse: collapse; }
.group-table th {
padding: 6px 12px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.8px;
text-transform: uppercase;
color: var(--text3);
text-align: center;
border-bottom: 1px solid var(--border);
}
.group-table th:first-child { text-align: left; }
.group-table td {
padding: 9px 12px;
font-size: 12px;
text-align: center;
border-bottom: 1px solid var(--border);
color: var(--text);
}
.group-table tr:last-child td { border-bottom: none; }
.group-table td:first-child { text-align: left; font-weight: 600; }
.group-table tr.qualify td { color: var(--text); }
.group-table tr:nth-child(3) td,
.group-table tr:nth-child(4) td { color: var(--text3); }
.qual-dot {
display: inline-block;
width: 6px; height: 6px;
background: var(--green);
border-radius: 50%;
margin-right: 6px;
vertical-align: middle;
}
/* ============================================================
SEO TIP BOX
============================================================ */
.seo-box {
background: linear-gradient(135deg, rgba(37,99,235,0.08), rgba(6,182,212,0.05));
border: 1px solid rgba(37,99,235,0.2);
border-radius: var(--r);
padding: 12px 16px;
font-size: 12px;
color: var(--text2);
margin-bottom: 16px;
display: flex;
align-items: flex-start;
gap: 10px;
line-height: 1.5;
}
.seo-box-icon {
width: 20px; height: 20px;
flex-shrink: 0;
margin-top: 1px;
color: var(--cyan);
}
/* ============================================================
PANES
============================================================ */
.pane { display: none; }
.pane.active { display: block; }
/* ============================================================
FOOTER
============================================================ */
footer {
background: var(--bg2);
border-top: 1px solid var(--border);
padding: 24px 20px;
margin-top: 40px;
position: relative;
z-index: 1;
}
.footer-inner {
max-width: 1280px;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
}
.footer-logo {
font-family: 'Bebas Neue', sans-serif;
font-size: 20px;
color: var(--gold);
letter-spacing: 2px;
}
.footer-links {
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.footer-links a {
font-size: 12px;
color: var(--text3);
text-decoration: none;
transition: color 0.12s;
}
.footer-links a:hover { color: var(--text2); }
.footer-copy {
font-size: 11px;
color: var(--text3);
width: 100%;
}
/* ============================================================
RESPONSIVE
============================================================ */
@media (max-width: 768px) {
.hero { padding: 30px 20px 24px; }
.hero-3d-ball { width: 80px; height: 80px; right: 16px; }
.hero-title { font-size: 44px; }
.hero-stats { gap: 16px; }
.articles-grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
.players-grid { grid-template-columns: repeat(auto-fill, minmax(145px, 1fr)); }
}
/* ============================================================
ANIMATIONS
============================================================ */
@keyframes fadeUp {
from { opacity:0; transform: translateY(16px); }
to { opacity:1; transform: translateY(0); }
}
.art-card, .player-card, .group-card {
animation: fadeUp 0.3s ease both;
}
</style>
</head>
<body>
<!-- NAV -->
<nav>
<div class="nav-inner">
<a class="nav-logo" href="https://www.sportslnv.com">Sports<span>LNV</span></a>
<div class="nav-tabs">
<button class="nav-tab active" onclick="showPane('articles',this)">⚽ 120 Articles</button>
<button class="nav-tab" onclick="showPane('players',this)">🌟 Players</button>
<button class="nav-tab" onclick="showPane('schedule',this)">📅 Schedule</button>
<button class="nav-tab" onclick="showPane('groups',this)">🏆 Groups</button>
</div>
<div class="live-pill"><span class="live-dot"></span> LIVE</div>
</div>
</nav>
<div class="wrapper">
<!-- HERO -->
<section class="hero" aria-label="FIFA World Cup 2026 Hub">
<div class="hero-bg-orb1" aria-hidden="true"></div>
<div class="hero-bg-orb2" aria-hidden="true"></div>
<div class="hero-bg-lines" aria-hidden="true"></div>
<div class="hero-badge">⚽ SportsLNV Exclusive Hub</div>
<h1 class="hero-title">FIFA<br>WORLD CUP<br><span class="hl">2026</span></h1>
<p class="hero-sub">Complete football hub — 120 SEO articles, live scores, player rankings & full match schedule. Your #1 World Cup destination.</p>
<div class="hero-stats">
<div class="hstat"><div class="hstat-num">120</div><div class="hstat-lbl">Articles</div></div>
<div class="hstat"><div class="hstat-num">48</div><div class="hstat-lbl">Teams</div></div>
<div class="hstat"><div class="hstat-num">104</div><div class="hstat-lbl">Matches</div></div>
<div class="hstat"><div class="hstat-num">16</div><div class="hstat-lbl">Venues</div></div>
<div class="hstat"><div class="hstat-num">5M+</div><div class="hstat-lbl">Traffic Goal</div></div>
<div class="hstat"><div class="hstat-num">Jun 11</div><div class="hstat-lbl">Kick-off</div></div>
</div>
<div class="hero-3d-ball" aria-hidden="true"></div>
</section>
<!-- LIVE SCORES BAR -->
<div class="scores-bar" role="region" aria-label="Live match scores">
<div class="scores-label"><span class="live-dot"></span> LIVE SCORES</div>
<div class="score-chips" id="liveScoreChips"></div>
</div>
<!-- PANE: ARTICLES -->
<section id="pane-articles" class="pane active" aria-label="120 Football Articles">
<div class="sec-head">
<h2 class="sec-title">All 120 Articles</h2>
<span class="sec-badge">Google Ranking Ready</span>
<span class="sec-count" id="artCountLabel">120 articles</span>
</div>
<div class="seo-box" role="note">
<svg class="seo-box-icon" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg>
<span><strong style="color:var(--cyan)">Google Traffic Strategy:</strong> Tier 1 articles (red bar) target 2M–5M+ daily traffic. Publish articles #1, #2, #3, #5, #6 TODAY — World Cup 2026 kicks off June 11. Peak search window is RIGHT NOW. Click any article to generate full content.</span>
</div>
<div class="tier-legend" aria-label="Traffic tier legend">
<div class="tl-item"><span class="tl-dot" style="background:var(--red)"></span> Tier 1: 2M–5M+ traffic</div>
<div class="tl-item"><span class="tl-dot" style="background:var(--gold)"></span> Tier 2: 500K–2M</div>
<div class="tl-item"><span class="tl-dot" style="background:var(--blue)"></span> Tier 3: 200K–500K</div>
<div class="tl-item"><span class="tl-dot" style="background:var(--green)"></span> Tier 4: 100K–200K</div>
</div>
<div class="filter-row">
<input type="text" class="search-box" placeholder="🔍 Search articles..." id="artSearch" oninput="filterArts()" aria-label="Search articles">
<button class="filter-btn active" onclick="setArtCat('all',this)">All</button>
<button class="filter-btn" onclick="setArtCat('wc',this)">⚽ World Cup</button>
<button class="filter-btn" onclick="setArtCat('player',this)">👤 Players</button>
<button class="filter-btn" onclick="setArtCat('fantasy',this)">🎮 Fantasy</button>
<button class="filter-btn" onclick="setArtCat('guide',this)">📖 Guides</button>
<button class="filter-btn" onclick="setArtCat('analysis',this)">📊 Analysis</button>
</div>
<div class="articles-grid" id="artGrid"></div>
<div class="pagination" id="artPagination"></div>
</section>
<!-- PANE: PLAYERS -->
<section id="pane-players" class="pane" aria-label="Player Rankings">
<div class="sec-head">
<h2 class="sec-title">Player Rankings</h2>
<span class="sec-badge">World Cup 2026 Watch List</span>
</div>
<div class="filter-row">
<button class="filter-btn active" onclick="setPlayerPos('all',this)">All</button>
<button class="filter-btn" onclick="setPlayerPos('Forward',this)">Forwards</button>
<button class="filter-btn" onclick="setPlayerPos('Midfielder',this)">Midfielders</button>
<button class="filter-btn" onclick="setPlayerPos('Defender',this)">Defenders</button>
<button class="filter-btn" onclick="setPlayerPos('Goalkeeper',this)">Keepers</button>
</div>
<div class="players-grid" id="playersGrid"></div>
</section>
<!-- PANE: SCHEDULE -->
<section id="pane-schedule" class="pane" aria-label="Match Schedule">
<div class="sec-head">
<h2 class="sec-title">Match Schedule</h2>
<span class="sec-badge">Jun 11 – Aug 4, 2026</span>
</div>
<div class="filter-row">
<button class="filter-btn active" onclick="setStage('all',this)">All Stages</button>
<button class="filter-btn" onclick="setStage('Group Stage',this)">Group Stage</button>
<button class="filter-btn" onclick="setStage('Round of 16',this)">Round of 16</button>
<button class="filter-btn" onclick="setStage('Quarter-final',this)">Quarter-finals</button>
<button class="filter-btn" onclick="setStage('Semi-final',this)">Semi-finals</button>
<button class="filter-btn" onclick="setStage('Final',this)">Final</button>
</div>
<div class="schedule-wrap">
<table aria-label="World Cup 2026 schedule">
<thead>
<tr>
<th>#</th>
<th>Date</th>
<th>Match</th>
<th>Venue</th>
<th>Stage</th>
<th>Time (ET)</th>
</tr>
</thead>
<tbody id="scheduleTbody"></tbody>
</table>
</div>
</section>
<!-- PANE: GROUPS -->
<section id="pane-groups" class="pane" aria-label="Group Stage Tables">
<div class="sec-head">
<h2 class="sec-title">Groups & Tables</h2>
<span class="sec-badge">12 Groups — 48 Teams</span>
</div>
<div class="groups-grid" id="groupsGrid"></div>
</section>
</div><!-- /wrapper -->
<!-- FOOTER -->
<footer>
<div class="footer-inner">
<div class="footer-logo">SportsLNV</div>
<div class="footer-links">
<a href="https://www.sportslnv.com">Home</a>
<a href="https://www.sportslnv.com/live">Live Scores</a>
<a href="https://www.sportslnv.com/news">News</a>
<a href="https://www.sportslnv.com/blog">Blog</a>
<a href="https://www.sportslnv.com/fantasy">Fantasy</a>
<a href="https://www.sportslnv.com/predictions">Predictions</a>
<a href="https://www.sportslnv.com/about">About</a>
<a href="https://www.sportslnv.com/contact">Contact</a>
</div>
<p class="footer-copy">© 2026 SportsLNV. All rights reserved. Your #1 destination for live scores, predictions & fantasy sports.</p>
</div>
</footer>
<script>
/* ============================================================
DATA
============================================================ */
const LIVE_SCORES = [
{t:"Spain 0–0 England", m:"67'", type:"live"},
{t:"Argentina 0–0 Colombia", m:"45'", type:"live"},
{t:"Leverkusen 0–0 Frankfurt", m:"31'", type:"live"},
{t:"Brazil 2–1 Ecuador", m:"FT", type:"ft"},
{t:"France 3–0 Tunisia", m:"FT", type:"ft"},
{t:"Germany 1–1 Italy", m:"FT", type:"ft"},
{t:"Portugal 2–0 Wales", m:"FT", type:"ft"},
{t:"USA vs Paraguay", m:"Jun 3 · 7PM", type:"up"},
];
const ARTICLES = [
// TIER 1 — 2M–5M+
{n:1,t:"FIFA World Cup 2026 Full Schedule: All 104 Matches, Dates, Venues & Times",tier:"t1",cat:"wc",tags:["v","w"],tr:98},
{n:2,t:"How to Watch FIFA World Cup 2026 Free — Complete Streaming Guide by Country",tier:"t1",cat:"guide",tags:["v","g"],tr:96},
{n:3,t:"World Cup 2026 Groups: All 48 Teams, Predictions & Dark Horses Revealed",tier:"t1",cat:"wc",tags:["w","a"],tr:95},
{n:4,t:"World Cup 2026 Bracket Predictor — Full Knockout Stage Preview & Picks",tier:"t1",cat:"wc",tags:["v","w"],tr:93},
{n:5,t:"Lionel Messi at World Cup 2026: Will He Play? Age, Fitness & Argentina Squad",tier:"t1",cat:"player",tags:["p","v"],tr:99},
{n:6,t:"Cristiano Ronaldo World Cup 2026 — Portugal's Last Hope or Final Farewell?",tier:"t1",cat:"player",tags:["p","v"],tr:97},
{n:7,t:"England vs Spain UEFA Euro 2026 Live Preview — H2H, Predicted XI & Odds",tier:"t1",cat:"analysis",tags:["a","w"],tr:90},
{n:8,t:"Top 10 Players to Watch at FIFA World Cup 2026 — Stars Who'll Define It",tier:"t1",cat:"player",tags:["p","w"],tr:94},
{n:9,t:"World Cup 2026 Host Cities: All 16 Venues in USA, Canada & Mexico Guide",tier:"t1",cat:"guide",tags:["g","w"],tr:88},
{n:10,t:"Best Fantasy Football Team for World Cup 2026 — Captain Picks & Budget XI",tier:"t1",cat:"fantasy",tags:["f","w"],tr:87},
// TIER 2 — 500K–2M
{n:11,t:"Kylian Mbappe 2026: Real Madrid Star's Biggest World Cup Yet — Full Preview",tier:"t2",cat:"player",tags:["p","w"],tr:85},
{n:12,t:"Premier League 2025/26 Golden Boot Race — Top Scorers, Stats & Predictions",tier:"t2",cat:"analysis",tags:["a"],tr:80},
{n:13,t:"Champions League Final 2026 Preview — Teams, Predictions & How to Watch",tier:"t2",cat:"wc",tags:["w","g"],tr:83},
{n:14,t:"World Cup 2026 Dark Horses — 5 Teams That Could Shock Everyone",tier:"t2",cat:"wc",tags:["w","a"],tr:79},
{n:15,t:"Argentina vs Brazil World Cup 2026 — Could the Greatest Rivalry Clash Again?",tier:"t2",cat:"wc",tags:["w","v"],tr:86},
{n:16,t:"World Cup 2026 Ticket Prices, How to Buy & Resale Guide — Full Breakdown",tier:"t2",cat:"guide",tags:["g","w"],tr:77},
{n:17,t:"Saudi Arabia at World Cup 2026 — Squad, Fixtures & Can They Shock Again?",tier:"t2",cat:"wc",tags:["w","a"],tr:72},
{n:18,t:"Jude Bellingham 2026 — England's Best Hope for World Cup Glory Explained",tier:"t2",cat:"player",tags:["p","w"],tr:82},
{n:19,t:"World Cup 2026 AI Predictions: Who Wins the Trophy According to Data?",tier:"t2",cat:"analysis",tags:["a","v"],tr:84},
{n:20,t:"Complete FIFA World Cup 2026 Match Results Hub — Updated After Every Game",tier:"t2",cat:"wc",tags:["w","g"],tr:90},
{n:21,t:"Vinicius Jr. at World Cup 2026 — Can Brazil Finally Win It All With Him?",tier:"t2",cat:"player",tags:["p","w"],tr:75},
{n:22,t:"Erling Haaland World Cup 2026 — Norway's First WC Since 1998?",tier:"t2",cat:"player",tags:["p"],tr:70},
{n:23,t:"World Cup 2026 Group A Preview — USA, Mexico, Canada & Full Analysis",tier:"t2",cat:"wc",tags:["w","a"],tr:68},
{n:24,t:"World Cup 2026 Group B Preview — England, Iran & Surprise Packages",tier:"t2",cat:"wc",tags:["w"],tr:67},
{n:25,t:"World Cup 2026 Group C Preview — Argentina's Road to the Final",tier:"t2",cat:"wc",tags:["w"],tr:69},
{n:26,t:"World Cup 2026 Group D Preview — France vs Denmark Showdown",tier:"t2",cat:"wc",tags:["w"],tr:65},
{n:27,t:"World Cup 2026 Group E Preview — Spain, Germany & Who Advances?",tier:"t2",cat:"wc",tags:["w"],tr:66},
{n:28,t:"World Cup 2026 Group F Preview — Brazil's Dominant Path Forward",tier:"t2",cat:"wc",tags:["w"],tr:70},
// TIER 3 — 200K–500K
{n:29,t:"Top 5 Goalkeepers at World Cup 2026 — Who Will Be the Unbeatable Wall?",tier:"t3",cat:"player",tags:["p","w"],tr:58},
{n:30,t:"Top 5 Defenders at World Cup 2026 — Best Backlines Ranked & Reviewed",tier:"t3",cat:"player",tags:["p"],tr:55},
{n:31,t:"Top 5 Midfielders at World Cup 2026 — Who Controls the Beautiful Game?",tier:"t3",cat:"player",tags:["p"],tr:56},
{n:32,t:"Top 10 Strikers at World Cup 2026 — Golden Boot Contenders Ranked",tier:"t3",cat:"player",tags:["p","w"],tr:60},
{n:33,t:"World Cup 2026 Fantasy Football Draft Guide — Full 23-Man Squad Strategy",tier:"t3",cat:"fantasy",tags:["f"],tr:62},
{n:34,t:"World Cup 2026 Fantasy Captains — Best Weekly Captain Choices Revealed",tier:"t3",cat:"fantasy",tags:["f"],tr:58},
{n:35,t:"World Cup 2026 Fantasy Differentials — Hidden Gems Worth Picking Now",tier:"t3",cat:"fantasy",tags:["f"],tr:54},
{n:36,t:"World Cup 2026 Betting Guide — Best Odds, Tips & Safe Platforms to Use",tier:"t3",cat:"guide",tags:["g"],tr:60},
{n:37,t:"FIFA World Cup 2026 Prize Money — How Much Do the Winners Really Earn?",tier:"t3",cat:"wc",tags:["w"],tr:57},
{n:38,t:"World Cup 2026 VAR Rules Guide — How It Works, Controversies & Changes",tier:"t3",cat:"guide",tags:["g"],tr:50},
{n:39,t:"World Cup 2026 Opening Ceremony — Date, Performers & What to Expect",tier:"t3",cat:"wc",tags:["w","g"],tr:63},
{n:40,t:"World Cup 2026 Final Venue — MetLife Stadium NJ Complete Fan Guide",tier:"t3",cat:"guide",tags:["g","w"],tr:55},
{n:41,t:"Pedri at World Cup 2026 — Spain's Midfield Maestro: Fully Fit & Dangerous",tier:"t3",cat:"player",tags:["p"],tr:52},
{n:42,t:"Marcus Rashford Redemption — Can He Shine at World Cup 2026 at Last?",tier:"t3",cat:"player",tags:["p"],tr:53},
{n:43,t:"Harry Kane World Cup 2026 — Bayern Munich Star's Shot at International Glory",tier:"t3",cat:"player",tags:["p","w"],tr:58},
{n:44,t:"Bukayo Saka at World Cup 2026 — England's Most Dangerous Attacking Weapon",tier:"t3",cat:"player",tags:["p"],tr:56},
{n:45,t:"Lamine Yamal's World Cup 2026 — 18-Year-Old Superstar vs the Entire World",tier:"t3",cat:"player",tags:["p","v"],tr:65},
{n:46,t:"Rodri World Cup 2026 — Spain's Heartbeat Returning From Injury?",tier:"t3",cat:"player",tags:["p"],tr:52},
{n:47,t:"Declan Rice at World Cup 2026 — Why He's England's Most Important Player",tier:"t3",cat:"player",tags:["p"],tr:54},
{n:48,t:"Achraf Hakimi — Morocco's Star and Africa's Best Hope at WC 2026",tier:"t3",cat:"player",tags:["p","w"],tr:51},
{n:49,t:"Africa's Best Teams at World Cup 2026 — Morocco, Nigeria & Senegal Preview",tier:"t3",cat:"wc",tags:["w","a"],tr:58},
{n:50,t:"Asian Teams at World Cup 2026 — Japan, South Korea & Saudi Arabia Preview",tier:"t3",cat:"wc",tags:["w"],tr:55},
{n:51,t:"CONCACAF at World Cup 2026 — USA, Mexico & Canada Home Advantage Explained",tier:"t3",cat:"wc",tags:["w"],tr:60},
{n:52,t:"World Cup 2026 Qualifiers Summary — How Every Team Made It to the Finals",tier:"t3",cat:"wc",tags:["w","g"],tr:50},
{n:53,t:"Germany at World Cup 2026 — Full Squad, New Manager & Tournament Prediction",tier:"t3",cat:"wc",tags:["w","a"],tr:57},
{n:54,t:"France at World Cup 2026 — Deschamps' Last Dance? Complete Preview",tier:"t3",cat:"wc",tags:["w","a"],tr:60},
{n:55,t:"Brazil at World Cup 2026 — New Manager, New Tactics & A Golden Chance",tier:"t3",cat:"wc",tags:["w","a"],tr:65},
{n:56,t:"Italy at World Cup 2026 — Back After Disaster, Can the Azzurri Finally Win?",tier:"t3",cat:"wc",tags:["w"],tr:55},
{n:57,t:"Netherlands at World Cup 2026 — Van Dijk's Last WC & De Jong's Prime",tier:"t3",cat:"wc",tags:["w"],tr:52},
{n:58,t:"Portugal at World Cup 2026 — After Ronaldo, Who Actually Leads the Nation?",tier:"t3",cat:"wc",tags:["w"],tr:58},
{n:59,t:"Belgium at World Cup 2026 — New Golden Generation or Just Another False Dawn?",tier:"t3",cat:"wc",tags:["w"],tr:50},
{n:60,t:"Croatia at World Cup 2026 — After Modric, Can They Still Compete at the Top?",tier:"t3",cat:"wc",tags:["w"],tr:49},
// TIER 4 — 100K–200K
{n:61,t:"World Cup 2026 Most Expensive Squads — Who Has the Richest Team in Qatar?",tier:"t4",cat:"analysis",tags:["a"],tr:45},
{n:62,t:"World Cup 2026 Youngest Players — 10 Future Stars You Absolutely Must Watch",tier:"t4",cat:"player",tags:["p"],tr:43},
{n:63,t:"World Cup 2026 Oldest Players — Veterans Defying Age at the Biggest Stage",tier:"t4",cat:"player",tags:["p"],tr:42},
{n:64,t:"World Cup 2026 Kit Guide — Every Nation's Official Jersey Ranked Best to Worst",tier:"t4",cat:"guide",tags:["g"],tr:47},
{n:65,t:"World Cup 2026 Best Goals of All Time — Top 10 Historic WC Moments Ranked",tier:"t4",cat:"wc",tags:["w","v"],tr:50},
{n:66,t:"World Cup 2026 Travel Guide — How to Attend Matches Across the USA",tier:"t4",cat:"guide",tags:["g"],tr:48},
{n:67,t:"World Cup 2026 Fan Guide — Everything You Need to Know Before You Go",tier:"t4",cat:"guide",tags:["g"],tr:46},
{n:68,t:"How to Play World Cup 2026 Fantasy on SportsLNV — Full Tutorial Guide",tier:"t4",cat:"fantasy",tags:["f","g"],tr:44},
{n:69,t:"World Cup 2026 Fantasy Gameweek 1 Tips — Best Starting XI for Opening Day",tier:"t4",cat:"fantasy",tags:["f"],tr:43},
{n:70,t:"World Cup 2026 Fantasy Gameweek 2 Tips — Early Captain Choices Revealed",tier:"t4",cat:"fantasy",tags:["f"],tr:41},
{n:71,t:"World Cup 2026 Fantasy Gameweek 3 Tips — Who to Transfer In & Out Now?",tier:"t4",cat:"fantasy",tags:["f"],tr:40},
{n:72,t:"World Cup 2026 Group Stage Results Tracker — All 48 Games Covered Daily",tier:"t4",cat:"wc",tags:["w"],tr:50},
{n:73,t:"World Cup 2026 Round of 16 Predictions — Our Expert Picks for Every Game",tier:"t4",cat:"wc",tags:["w","a"],tr:52},
{n:74,t:"World Cup 2026 Quarter-Final Previews — 4 Blockbuster Matches Fully Analysed",tier:"t4",cat:"analysis",tags:["a","w"],tr:54},
{n:75,t:"World Cup 2026 Semi-Final Predictions — Which Two Teams Make the Final?",tier:"t4",cat:"wc",tags:["w","a"],tr:56},
{n:76,t:"World Cup 2026 Final Preview — The Two Best Teams in the World Face Off",tier:"t4",cat:"wc",tags:["w","v"],tr:70},
{n:77,t:"World Cup 2026 Golden Boot Winner Prediction — Top 5 Scorers to Watch",tier:"t4",cat:"wc",tags:["w","p"],tr:55},
{n:78,t:"World Cup 2026 Golden Glove — Best Goalkeepers Who Could Win the Award",tier:"t4",cat:"player",tags:["p","w"],tr:43},
{n:79,t:"World Cup 2026 Best XI — Our Predicted All-Tournament Dream Team",tier:"t4",cat:"analysis",tags:["a"],tr:48},
{n:80,t:"World Cup 2026 Referee Guide — Who Are the Match Officials at Each Game?",tier:"t4",cat:"guide",tags:["g"],tr:38},
{n:81,t:"World Cup 2026 Official Ball — Adidas Design, Name & Special Features Revealed",tier:"t4",cat:"guide",tags:["g"],tr:40},
{n:82,t:"World Cup 2026 Official Song & Anthem — The Tournament's Music Fully Revealed",tier:"t4",cat:"wc",tags:["w"],tr:45},
{n:83,t:"5 New FIFA Rules at World Cup 2026 — Changes That Will Shock Football Fans",tier:"t4",cat:"guide",tags:["g","w"],tr:47},
{n:84,t:"World Cup 2026 USA vs Mexico Match Preview — The Derby Everyone Wants to See",tier:"t4",cat:"wc",tags:["w","a"],tr:52},
{n:85,t:"World Cup 2026 England vs France Dream Clash — Will This Epic Tie Happen?",tier:"t4",cat:"wc",tags:["w"],tr:51},
{n:86,t:"World Cup 2026 Argentina vs France Rematch — The 2022 Final Sequel?",tier:"t4",cat:"wc",tags:["w","v"],tr:60},
{n:87,t:"World Cup 2026 Brazil vs Argentina — The Ultimate South American Derby Preview",tier:"t4",cat:"wc",tags:["w","v"],tr:58},
{n:88,t:"Thierry Henry Coaching at World Cup 2026 — Full Preview & Bold Predictions",tier:"t4",cat:"analysis",tags:["a"],tr:42},
{n:89,t:"World Cup 2026 Managers Ranked — Who Has the Best Tactical Master Plan?",tier:"t4",cat:"analysis",tags:["a"],tr:45},
{n:90,t:"World Cup 2026 Shocks & Upsets Predicted — 5 Giant Killings to Expect",tier:"t4",cat:"analysis",tags:["a","v"],tr:48},
{n:91,t:"Goalscoring Records at World Cup History — Who Can Break Them in 2026?",tier:"t4",cat:"wc",tags:["w","p"],tr:44},
{n:92,t:"World Cup 2026 Group G Preview — Full Analysis & Qualification Predictions",tier:"t4",cat:"wc",tags:["w"],tr:40},
{n:93,t:"World Cup 2026 Group H Preview — Is This the New Group of Death?",tier:"t4",cat:"wc",tags:["w"],tr:41},
{n:94,t:"World Cup 2026 Group I Preview — Sleeping Giants & Major Surprise Teams",tier:"t4",cat:"wc",tags:["w"],tr:39},
{n:95,t:"World Cup 2026 Group J Preview — Three Big Teams in One Dangerous Group",tier:"t4",cat:"wc",tags:["w"],tr:38},
{n:96,t:"World Cup 2026 Group K Preview — South American Powerhouse Group Analysis",tier:"t4",cat:"wc",tags:["w"],tr:38},
{n:97,t:"World Cup 2026 Group L Preview — European Giants Battle for the Top Spot",tier:"t4",cat:"wc",tags:["w"],tr:39},
{n:98,t:"SportsLNV Live Score Guide — How to Use Our Real-Time Match Tracker",tier:"t4",cat:"guide",tags:["g"],tr:36},
{n:99,t:"World Cup 2026 Stats Hub — Goals, Assists, Passes & Clean Sheets Tracked",tier:"t4",cat:"analysis",tags:["a"],tr:44},
{n:100,t:"World Cup 2026 Top 5 Matches to Watch — The Must-See Games of the Tournament",tier:"t4",cat:"wc",tags:["w","v"],tr:50},
{n:101,t:"Phil Foden at World Cup 2026 — City Star's International Stage Redemption",tier:"t4",cat:"player",tags:["p"],tr:45},
{n:102,t:"Federico Valverde at WC 2026 — Uruguay's Most Complete & Dangerous Player",tier:"t4",cat:"player",tags:["p"],tr:38},
{n:103,t:"Gavi's Return — Can the Barcelona Maestro Lead Spain at the World Cup?",tier:"t4",cat:"player",tags:["p","w"],tr:44},
{n:104,t:"Kevin De Bruyne's Final World Cup — Belgium Legend's Very Last Chance",tier:"t4",cat:"player",tags:["p"],tr:46},
{n:105,t:"Alexia Putellas — From Women's Ballon d'Or to Global Football Icon",tier:"t4",cat:"player",tags:["p"],tr:38},
{n:106,t:"World Cup 2026 vs 2022 Qatar — How the Tournament Has Fundamentally Changed",tier:"t4",cat:"analysis",tags:["a"],tr:40},
{n:107,t:"Best World Cup 2026 Fan Zones — Where to Watch Matches Across the USA",tier:"t4",cat:"guide",tags:["g"],tr:43},
{n:108,t:"World Cup 2026 USMNT Squad — Full Player Ratings & Best Starting XI",tier:"t4",cat:"wc",tags:["w","a"],tr:50},
{n:109,t:"Christian Pulisic World Cup 2026 — USA's Captain America Must Step Up Now",tier:"t4",cat:"player",tags:["p","w"],tr:48},
{n:110,t:"World Cup 2026 Mexico Squad — Can El Tri Finally Go Beyond the Round of 16?",tier:"t4",cat:"wc",tags:["w"],tr:45},
{n:111,t:"World Cup 2026 Canada Squad — Jonathan David Leads the Canucks to History",tier:"t4",cat:"wc",tags:["w"],tr:42},
{n:112,t:"Japan at World Cup 2026 — Is This Asia's Greatest Squad in Tournament History?",tier:"t4",cat:"wc",tags:["w"],tr:44},
{n:113,t:"South Korea at World Cup 2026 — Son Heung-min's Final World Cup Bow?",tier:"t4",cat:"player",tags:["p","w"],tr:46},
{n:114,t:"Son Heung-min World Cup 2026 — Tottenham Legend's Emotional Farewell?",tier:"t4",cat:"player",tags:["p"],tr:43},
{n:115,t:"Robert Lewandowski World Cup 2026 — Poland's King at His Last Major Tournament?",tier:"t4",cat:"player",tags:["p"],tr:44},
{n:116,t:"World Cup 2026 South American Teams Ranked — Who Is Genuinely the Strongest?",tier:"t4",cat:"analysis",tags:["a","w"],tr:42},
{n:117,t:"World Cup 2026 European Teams Ranked — 6 Serious Contenders, Only 1 Trophy",tier:"t4",cat:"analysis",tags:["a"],tr:43},
{n:118,t:"World Cup 2026 Tactical Masterclasses — 5 Coaching Blueprints Fully Explained",tier:"t4",cat:"analysis",tags:["a"],tr:40},
{n:119,t:"World Cup 2026 Post-Tournament Analysis — What Happens to Football After the Final",tier:"t4",cat:"analysis",tags:["a"],tr:38},
{n:120,t:"SportsLNV World Cup 2026 Full Coverage Hub — Your Complete One-Stop Guide",tier:"t4",cat:"guide",tags:["g","w"],tr:55},
];
const PLAYERS = [
{rank:1,name:"Lionel Messi",nat:"Argentina",pos:"Forward",goals:15,apps:26,age:38,col:"#1a6b3a"},
{rank:2,name:"Kylian Mbappe",nat:"France",pos:"Forward",goals:14,apps:24,age:27,col:"#003189"},
{rank:3,name:"Cristiano Ronaldo",nat:"Portugal",pos:"Forward",goals:13,apps:25,age:41,col:"#A9221F"},
{rank:4,name:"Vinicius Jr.",nat:"Brazil",pos:"Winger",goals:11,apps:22,age:24,col:"#009c3b"},
{rank:5,name:"Jude Bellingham",nat:"England",pos:"Midfielder",goals:10,apps:23,age:22,col:"#003090"},
{rank:6,name:"Erling Haaland",nat:"Norway",pos:"Striker",goals:12,apps:20,age:25,col:"#CF091A"},
{rank:7,name:"Lamine Yamal",nat:"Spain",pos:"Winger",goals:8,apps:18,age:18,col:"#c60b1e"},
{rank:8,name:"Harry Kane",nat:"England",pos:"Striker",goals:9,apps:22,age:31,col:"#003090"},
{rank:9,name:"Pedri",nat:"Spain",pos:"Midfielder",goals:6,apps:20,age:22,col:"#c60b1e"},
{rank:10,name:"Bukayo Saka",nat:"England",pos:"Winger",goals:7,apps:21,age:23,col:"#063672"},
{rank:11,name:"Rodri",nat:"Spain",pos:"Midfielder",goals:4,apps:19,age:28,col:"#c60b1e"},
{rank:12,name:"Kevin De Bruyne",nat:"Belgium",pos:"Midfielder",goals:5,apps:20,age:34,col:"#EF3340"},
{rank:13,name:"Declan Rice",nat:"England",pos:"Midfielder",goals:3,apps:22,age:26,col:"#003090"},
{rank:14,name:"Achraf Hakimi",nat:"Morocco",pos:"Defender",goals:4,apps:21,age:26,col:"#C1272D"},
{rank:15,name:"Federico Valverde",nat:"Uruguay",pos:"Midfielder",goals:5,apps:19,age:26,col:"#5EB6E4"},
{rank:16,name:"Phil Foden",nat:"England",pos:"Midfielder",goals:6,apps:20,age:26,col:"#6CABDD"},
{rank:17,name:"Gavi",nat:"Spain",pos:"Midfielder",goals:3,apps:17,age:24,col:"#c60b1e"},
{rank:18,name:"Jonathan David",nat:"Canada",pos:"Striker",goals:8,apps:18,age:24,col:"#FF0000"},
{rank:19,name:"Christian Pulisic",nat:"USA",pos:"Winger",goals:7,apps:20,age:27,col:"#002868"},
{rank:20,name:"Son Heung-min",nat:"South Korea",pos:"Forward",goals:6,apps:19,age:34,col:"#C60C30"},
{rank:21,name:"Trent Alexander-Arnold",nat:"England",pos:"Defender",goals:3,apps:18,age:27,col:"#C8102E"},
{rank:22,name:"Robert Lewandowski",nat:"Poland",pos:"Striker",goals:8,apps:19,age:37,col:"#DC143C"},
{rank:23,name:"Ruben Dias",nat:"Portugal",pos:"Defender",goals:2,apps:20,age:27,col:"#A9221F"},
{rank:24,name:"Jamal Musiala",nat:"Germany",pos:"Midfielder",goals:9,apps:21,age:22,col:"#000"},
];
const SCHEDULE = [
{n:1,d:"Jun 11",t:"Mexico vs Opening TBD",v:"Estadio Azteca, Mexico City",s:"Group Stage",tm:"3:00 PM"},
{n:2,d:"Jun 12",t:"USA vs TBD",v:"SoFi Stadium, Los Angeles",s:"Group Stage",tm:"6:00 PM"},
{n:3,d:"Jun 12",t:"Canada vs TBD",v:"BMO Field, Toronto",s:"Group Stage",tm:"9:00 PM"},
{n:4,d:"Jun 13",t:"England vs TBD",v:"MetLife Stadium, NJ",s:"Group Stage",tm:"3:00 PM"},
{n:5,d:"Jun 13",t:"France vs TBD",v:"AT&T Stadium, Dallas",s:"Group Stage",tm:"6:00 PM"},
{n:6,d:"Jun 14",t:"Brazil vs TBD",v:"Lumen Field, Seattle",s:"Group Stage",tm:"3:00 PM"},
{n:7,d:"Jun 14",t:"Argentina vs TBD",v:"Rose Bowl, Pasadena",s:"Group Stage",tm:"6:00 PM"},
{n:8,d:"Jun 15",t:"Spain vs TBD",v:"Hard Rock Stadium, Miami",s:"Group Stage",tm:"3:00 PM"},
{n:9,d:"Jun 15",t:"Germany vs TBD",v:"Lincoln Financial Field, Philly",s:"Group Stage",tm:"6:00 PM"},
{n:10,d:"Jun 16",t:"Portugal vs TBD",v:"Gillette Stadium, Boston",s:"Group Stage",tm:"3:00 PM"},
{n:11,d:"Jun 17",t:"Netherlands vs TBD",v:"Arrowhead Stadium, KC",s:"Group Stage",tm:"6:00 PM"},
{n:12,d:"Jun 18",t:"Japan vs TBD",v:"BC Place, Vancouver",s:"Group Stage",tm:"3:00 PM"},
{n:13,d:"Jun 19",t:"Morocco vs TBD",v:"MetLife Stadium, NJ",s:"Group Stage",tm:"6:00 PM"},
{n:14,d:"Jun 20",t:"Italy vs TBD",v:"SoFi Stadium, LA",s:"Group Stage",tm:"3:00 PM"},
{n:15,d:"Jun 21",t:"Belgium vs TBD",v:"AT&T Stadium, Dallas",s:"Group Stage",tm:"3:00 PM"},
{n:16,d:"Jun 22",t:"Croatia vs TBD",v:"Hard Rock Stadium, Miami",s:"Group Stage",tm:"6:00 PM"},
{n:17,d:"Jun 23",t:"South Korea vs TBD",v:"Rose Bowl, Pasadena",s:"Group Stage",tm:"3:00 PM"},
{n:18,d:"Jun 24",t:"Saudi Arabia vs TBD",v:"Lumen Field, Seattle",s:"Group Stage",tm:"6:00 PM"},
{n:19,d:"Jun 25",t:"Uruguay vs TBD",v:"BC Place, Vancouver",s:"Group Stage",tm:"3:00 PM"},
{n:20,d:"Jun 26",t:"Mexico vs TBD (MD2)",v:"Estadio Azteca, Mexico City",s:"Group Stage",tm:"3:00 PM"},
{n:21,d:"Jun 27",t:"USA vs TBD (MD2)",v:"SoFi Stadium, LA",s:"Group Stage",tm:"6:00 PM"},
{n:22,d:"Jun 28",t:"England vs TBD (MD2)",v:"MetLife Stadium, NJ",s:"Group Stage",tm:"3:00 PM"},
{n:23,d:"Jun 29",t:"Brazil vs TBD (MD2)",v:"Rose Bowl, Pasadena",s:"Group Stage",tm:"6:00 PM"},
{n:24,d:"Jun 30",t:"Argentina vs TBD (MD2)",v:"Hard Rock Stadium, Miami",s:"Group Stage",tm:"3:00 PM"},
{n:25,d:"Jul 1",t:"Spain vs TBD (MD2)",v:"AT&T Stadium, Dallas",s:"Group Stage",tm:"6:00 PM"},
{n:26,d:"Jul 2",t:"Germany vs TBD (MD2)",v:"Gillette Stadium, Boston",s:"Group Stage",tm:"3:00 PM"},
{n:27,d:"Jul 3",t:"France vs TBD (MD2)",v:"Lumen Field, Seattle",s:"Group Stage",tm:"6:00 PM"},
{n:28,d:"Jul 4",t:"Portugal vs TBD (MD2)",v:"Lincoln Financial Field, Philly",s:"Group Stage",tm:"3:00 PM"},
{n:29,d:"Jul 5",t:"Netherlands vs TBD (MD2)",v:"BC Place, Vancouver",s:"Group Stage",tm:"6:00 PM"},
{n:30,d:"Jul 7",t:"Mexico vs TBD (MD3)",v:"Estadio Azteca, Mexico City",s:"Group Stage",tm:"3:00 PM"},
{n:31,d:"Jul 8",t:"USA vs TBD (MD3)",v:"MetLife Stadium, NJ",s:"Group Stage",tm:"6:00 PM"},
{n:32,d:"Jul 9",t:"England vs TBD (MD3)",v:"SoFi Stadium, LA",s:"Group Stage",tm:"3:00 PM"},
{n:33,d:"Jul 10",t:"Brazil vs TBD (MD3)",v:"Rose Bowl, Pasadena",s:"Group Stage",tm:"6:00 PM"},
{n:34,d:"Jul 11",t:"Argentina vs TBD (MD3)",v:"Hard Rock Stadium, Miami",s:"Group Stage",tm:"3:00 PM"},
{n:35,d:"Jul 12",t:"Spain vs TBD (MD3)",v:"AT&T Stadium, Dallas",s:"Group Stage",tm:"6:00 PM"},
{n:36,d:"Jul 13",t:"Germany vs TBD (MD3)",v:"Gillette Stadium, Boston",s:"Group Stage",tm:"3:00 PM"},
{n:37,d:"Jul 14",t:"France vs TBD (MD3)",v:"Lumen Field, Seattle",s:"Group Stage",tm:"6:00 PM"},
{n:38,d:"Jul 15",t:"Portugal vs TBD (MD3)",v:"BC Place, Vancouver",s:"Group Stage",tm:"3:00 PM"},
{n:39,d:"Jul 16",t:"Group A Winner vs Group B Runner-up",v:"MetLife Stadium, NJ",s:"Round of 16",tm:"3:00 PM"},
{n:40,d:"Jul 16",t:"Group C Winner vs Group D Runner-up",v:"SoFi Stadium, LA",s:"Round of 16",tm:"9:00 PM"},
{n:41,d:"Jul 17",t:"Group B Winner vs Group A Runner-up",v:"AT&T Stadium, Dallas",s:"Round of 16",tm:"3:00 PM"},
{n:42,d:"Jul 17",t:"Group D Winner vs Group C Runner-up",v:"Rose Bowl, Pasadena",s:"Round of 16",tm:"9:00 PM"},
{n:43,d:"Jul 18",t:"Group E Winner vs Group F Runner-up",v:"Hard Rock Stadium, Miami",s:"Round of 16",tm:"3:00 PM"},
{n:44,d:"Jul 18",t:"Group G Winner vs Group H Runner-up",v:"Gillette Stadium, Boston",s:"Round of 16",tm:"9:00 PM"},
{n:45,d:"Jul 19",t:"Group F Winner vs Group E Runner-up",v:"Lumen Field, Seattle",s:"Round of 16",tm:"3:00 PM"},
{n:46,d:"Jul 19",t:"Group H Winner vs Group G Runner-up",v:"Lincoln Financial Field, Philly",s:"Round of 16",tm:"9:00 PM"},
{n:47,d:"Jul 20",t:"Group I Winner vs Group J Runner-up",v:"BC Place, Vancouver",s:"Round of 16",tm:"3:00 PM"},
{n:48,d:"Jul 20",t:"Group K Winner vs Group L Runner-up",v:"Estadio Azteca, Mexico City",s:"Round of 16",tm:"9:00 PM"},
{n:49,d:"Jul 21",t:"Group J Winner vs Group I Runner-up",v:"MetLife Stadium, NJ",s:"Round of 16",tm:"3:00 PM"},
{n:50,d:"Jul 21",t:"Group L Winner vs Group K Runner-up",v:"SoFi Stadium, LA",s:"Round of 16",tm:"9:00 PM"},
{n:51,d:"Jul 24",t:"R16 W1 vs R16 W2",v:"AT&T Stadium, Dallas",s:"Quarter-final",tm:"3:00 PM"},
{n:52,d:"Jul 24",t:"R16 W3 vs R16 W4",v:"Rose Bowl, Pasadena",s:"Quarter-final",tm:"9:00 PM"},
{n:53,d:"Jul 25",t:"R16 W5 vs R16 W6",v:"Hard Rock Stadium, Miami",s:"Quarter-final",tm:"3:00 PM"},
{n:54,d:"Jul 25",t:"R16 W7 vs R16 W8",v:"Gillette Stadium, Boston",s:"Quarter-final",tm:"9:00 PM"},
{n:55,d:"Jul 28",t:"QF Winner 1 vs QF Winner 2",v:"MetLife Stadium, NJ",s:"Semi-final",tm:"6:00 PM"},
{n:56,d:"Jul 29",t:"QF Winner 3 vs QF Winner 4",v:"SoFi Stadium, LA",s:"Semi-final",tm:"6:00 PM"},
{n:57,d:"Aug 1",t:"3rd Place Play-off",v:"AT&T Stadium, Dallas",s:"Semi-final",tm:"3:00 PM"},
{n:58,d:"Aug 4",t:"🏆 THE GRAND FINAL — SF Winner 1 vs SF Winner 2",v:"MetLife Stadium, East Rutherford NJ",s:"Final",tm:"6:00 PM"},
];
const GROUPS = [
{name:"Group A",teams:["USA","Panama","Uruguay","TBD"]},
{name:"Group B",teams:["England","TBD","TBD","TBD"]},
{name:"Group C",teams:["Argentina","TBD","TBD","TBD"]},
{name:"Group D",teams:["France","TBD","TBD","TBD"]},
{name:"Group E",teams:["Spain","Germany","TBD","TBD"]},
{name:"Group F",teams:["Brazil","TBD","TBD","TBD"]},
{name:"Group G",teams:["Portugal","TBD","TBD","TBD"]},
{name:"Group H",teams:["Morocco","TBD","TBD","TBD"]},
{name:"Group I",teams:["Italy","Japan","TBD","TBD"]},
{name:"Group J",teams:["Netherlands","Belgium","TBD","TBD"]},
{name:"Group K",teams:["South Korea","TBD","TBD","TBD"]},
{name:"Group L",teams:["Croatia","Saudi Arabia","TBD","TBD"]},
];
/* ============================================================
STATE
============================================================ */
let artPage = 1;
const PER = 24;
let artCat = 'all';
let artSearch = '';
let stageFilter = 'all';
let playerPos = 'all';
/* ============================================================
RENDER: LIVE SCORES
============================================================ */
function renderLiveScores() {
const el = document.getElementById('liveScoreChips');
el.innerHTML = LIVE_SCORES.map(s => {
const extra = s.type === 'live' ? `<span class="mins">${s.m}</span>` :
s.type === 'ft' ? `<span class="ft">${s.m}</span>` :
`<span class="ft" style="color:var(--cyan)">${s.m}</span>`;
return `<div class="score-chip">${s.t}${extra}</div>`;
}).join('');
}
/* ============================================================
RENDER: ARTICLES
============================================================ */
const TAG_MAP = {
v:['tag-v','🔥 Viral'],w:['tag-w','⚽ WC26'],p:['tag-p','👤 Player'],
g:['tag-g','📖 Guide'],a:['tag-a','📊 Analysis'],f:['tag-f','🎮 Fantasy']
};
function getFiltered() {
return ARTICLES.filter(a => {
const catOk = artCat === 'all' || a.cat === artCat;
const searchOk = !artSearch || a.t.toLowerCase().includes(artSearch);
return catOk && searchOk;
});
}
function renderArticles() {
const filtered = getFiltered();
const total = filtered.length;
const pages = Math.ceil(total / PER);
const start = (artPage - 1) * PER;
const slice = filtered.slice(start, start + PER);
document.getElementById('artCountLabel').textContent = `${total} article${total !== 1 ? 's' : ''}`;
const grid = document.getElementById('artGrid');
grid.innerHTML = slice.map((a, i) => {
const tags = a.tags.slice(0,2).map(t => `<span class="tag ${TAG_MAP[t][0]}">${TAG_MAP[t][1]}</span>`).join('');
const url = `https://www.sportslnv.com/news/${a.t.toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/-+/g,'-').replace(/^-|-$/g,'')}`;
return `<a class="art-card ${a.tier}" href="${url}" style="animation-delay:${i*0.02}s" aria-label="Article ${a.n}: ${a.t}">
<div class="art-num">#${a.n}</div>
<div class="art-title">${a.t}</div>
<div class="art-tags">${tags}</div>
<div class="traffic-bar"><div class="traffic-fill" style="width:${a.tr}%"></div></div>
</a>`;
}).join('');
// Pagination
const pag = document.getElementById('artPagination');
if (pages <= 1) { pag.innerHTML = ''; return; }
let html = '';
html += `<button class="pg-btn" onclick="goPage(${artPage-1})" ${artPage===1?'disabled':''}>‹</button>`;
for (let i = 1; i <= pages; i++) {
if (pages > 7 && i > 2 && i < pages - 1 && Math.abs(i - artPage) > 1) {
if (i === 3 || i === pages - 2) html += `<button class="pg-btn" disabled style="border:none;background:transparent;color:var(--text3)">…</button>`;
continue;
}
html += `<button class="pg-btn ${i===artPage?'active':''}" onclick="goPage(${i})">${i}</button>`;
}
html += `<button class="pg-btn" onclick="goPage(${artPage+1})" ${artPage===pages?'disabled':''}>›</button>`;
pag.innerHTML = html;
}
function goPage(p) {
artPage = p;
renderArticles();
document.getElementById('pane-articles').scrollIntoView({behavior:'smooth',block:'start'});
}
function setArtCat(cat, el) {
artCat = cat;
artPage = 1;
document.querySelectorAll('#pane-articles .filter-btn').forEach(b => b.classList.remove('active'));
el.classList.add('active');
renderArticles();
}
function filterArts() {
artSearch = document.getElementById('artSearch').value.toLowerCase().trim();
artPage = 1;
renderArticles();
}
/* ============================================================
RENDER: PLAYERS
============================================================ */
function renderPlayers() {
const pos = playerPos;
const filtered = pos === 'all' ? PLAYERS : PLAYERS.filter(p => p.pos === pos || p.pos.includes(pos.replace(/s$/,'')));
const grid = document.getElementById('playersGrid');
grid.innerHTML = filtered.map((p, i) => {
const rankClass = p.rank===1?'r1':p.rank===2?'r2':p.rank===3?'r3':'rn';
const initials = p.name.split(' ').map(w=>w[0]).slice(0,2).join('');
const url = `https://www.sportslnv.com/news/${p.name.toLowerCase().replace(/\s+/g,'-')}-world-cup-2026`;
return `<a class="player-card" href="${url}" style="animation-delay:${i*0.03}s;text-decoration:none;" aria-label="${p.name} - ${p.nat} - Rank ${p.rank}">
<div class="p-rank ${rankClass}">#${p.rank} RANKED</div>
<div class="p-avatar" style="background:${p.col}">${initials}</div>
<div class="p-name">${p.name}</div>
<div class="p-nat">${p.nat}</div>
<span class="p-pos-badge">${p.pos}</span>
<div class="p-stats">
<div class="p-stat-item"><div class="p-stat-val">${p.goals}</div><div class="p-stat-lbl">Goals</div></div>
<div class="p-stat-item"><div class="p-stat-val">${p.apps}</div><div class="p-stat-lbl">Apps</div></div>
<div class="p-stat-item"><div class="p-stat-val">${p.age}</div><div class="p-stat-lbl">Age</div></div>
</div>
</a>`;
}).join('');
}
function setPlayerPos(pos, el) {
playerPos = pos;
document.querySelectorAll('#pane-players .filter-btn').forEach(b => b.classList.remove('active'));
el.classList.add('active');
renderPlayers();
}
/* ============================================================
RENDER: SCHEDULE
============================================================ */
const STAGE_CLASS = {'Group Stage':'sg','Round of 16':'r16','Quarter-final':'qf','Semi-final':'sf','Final':'fn'};
const STAGE_LABEL = {'Group Stage':'Group Stage','Round of 16':'Round of 16','Quarter-final':'QF','Semi-final':'SF','Final':'🏆 FINAL'};
function renderSchedule() {
const tbody = document.getElementById('scheduleTbody');
const data = stageFilter === 'all' ? SCHEDULE : SCHEDULE.filter(m => m.s === stageFilter);
tbody.innerHTML = data.map(m => {
const parts = m.t.split(' vs ');
const team1 = parts[0];
const team2 = parts.slice(1).join(' vs ');
return `<tr>
<td class="td-num">${m.n}</td>
<td class="td-date">${m.d}</td>
<td><div class="match-name">${team1}<span class="vs-tag">vs</span>${team2}</div></td>
<td class="venue-cell">${m.v}</td>
<td><span class="stage-pill ${STAGE_CLASS[m.s]}">${STAGE_LABEL[m.s]}</span></td>
<td class="td-time">${m.tm}</td>
</tr>`;
}).join('');
}
function setStage(stage, el) {
stageFilter = stage;
document.querySelectorAll('#pane-schedule .filter-btn').forEach(b => b.classList.remove('active'));
el.classList.add('active');
renderSchedule();
}
/* ============================================================
RENDER: GROUPS
============================================================ */
function renderGroups() {
const grid = document.getElementById('groupsGrid');
grid.innerHTML = GROUPS.map(g => {
const rows = g.teams.map((team, i) => `
<tr class="${i < 2 ? 'qualify' : ''}">
<td>${i < 2 ? '<span class="qual-dot" aria-label="Qualifies"></span>' : ''}${team}</td>
<td>0</td><td>0</td><td>0</td><td>0</td>
<td><strong>0</strong></td>
</tr>`).join('');
return `<div class="group-card">
<div class="group-head">${g.name}</div>
<table class="group-table" aria-label="${g.name} standings">
<thead><tr><th>Team</th><th>P</th><th>W</th><th>D</th><th>L</th><th>Pts</th></tr></thead>
<tbody>${rows}</tbody>
</table>
</div>`;
}).join('');
}
/* ============================================================
PANE SWITCHER
============================================================ */
function showPane(id, el) {
document.querySelectorAll('.pane').forEach(p => p.classList.remove('active'));
document.querySelectorAll('.nav-tab').forEach(b => b.classList.remove('active'));
document.getElementById('pane-' + id).classList.add('active');
el.classList.add('active');
}
/* ============================================================
INIT
============================================================ */
renderLiveScores();
renderArticles();
renderPlayers();
renderSchedule();
renderGroups();
</script>
</body>
</html>
Related News
Breaking NewsFIFA World Cup 2026 — Complete Football Hub
1 day ago0
Breaking NewsHow to Watch FIFA World Cup 2026 Free — Full Streaming Guide by Country
4 days ago0
Breaking NewsSaudi Arabia's Saud Abdulhamid Misses Training After Passport Stolen at Wedding — World Cup Doubt?
4 days ago0
Breaking NewsWhere to Watch FIFA World Cup 2026 — TV Channels, Live Streaming & Free Options
4 days ago0