CON LA FIEL

Atlas FC — Atlasfc Escudo Rgb

POR LA FIEL

01 · AGENDA DEPORTIVA

PRÓXIMOS PARTIDOS

Asegura tu lugar en la siguiente jornada rojinegra. Vive cada gol desde el Estadio Jalisco.

ADQUIERE TU PACK Y AHORRA

Los duelos que no te puedes perder, juntos y con descuento. Elige tu pack y asegura tu lugar en la casa rojinegra.

ADQUIERE TU PASE

Adquiere tu pase mensual o anual

Liga MX
Image
Liga MX
Grupo de Animación
Image
No existen próximos eventos para atlas FC
Consulta todos los eventos disponibles
No existen próximos eventos para atlas FC
Consulta todos los eventos disponibles
calendario de torneo

LIGA MX · APERTURA 2026

Las 17 jornadas del Rojinegro en la fase regular. Fechas, horarios y sedes en un solo lugar.

ver calendario
Image

J10

ATLAS

2-1

CRUZ AZUL

ATLAS

2-1

CRUZ AZUL

próximo

Liga MX
03 · MÉTRICAS Y ESTADÍSTICAS

EL TORNEO EN NÚMEROS

Tabla general, líderes de goleo y datos clave del equipo durante el Apertura 2026.

TABLA GENERAL
Clausura 2026
Atlas FC — Liga Mx

Pos

Club

PJ

G

E

P

GF

GC

DG

Pts

Pos

Club

PJ

G

D

L

GF

GA

GD

Pts

1

Image

Atlas

12

9

3

0

26

10

+16

30

1

Image

Atlas

12

9

3

0

26

10

+16

30

GOLEADORES
TOP 5 · LIGA MX
1
Atlas FC — Agustin

Jeremy Márquez

12 goles

DATOS CLAVE
temporada actual
expectativa de goles
1.84

xG/Partida

#17 goles anotados de la liga

goles a favor
16

EN 17 PARTIDOS

#17 goles anotados de la liga

goles por partido
1.84

PROMEDIO

#17 goles anotados de la liga

02 · blog rojinegro

ÚLTIMAS NOTICIAS

Crónicas, entrevistas, análisis y novedades del primer equipo, fuerzas básicas y todo el universo Atlas.

VER TODAS las notas
Image

Atlas FC

October 29, 2026

Atlas FC fortalece su ecosistema tecnológico junto a Teamworks

Incorporamos Teamworks Hub y Teamworks S&C a Atlas FC

Atlas FC

October 29, 2026

Luis Esteves confía en el proyecto que se construye en Atlas FC

Conferencia de Prensa con Luis Esteves

Atlas FC

October 28, 2026

Semana Rojinegra: Atlas FC busca seguir entre los líderes en San Luis

Semana Rojinegra: Atlas FC visita al Atlético de San Luis

ver todas las notas
Image
05 · PATROCINADORES OFICIALES

QUIÉNES NOS ACOMPAÑAN

1000 VECES,

ARRIBA EL ATLAS
07 · tienda oficial

LLEVA LOS COLORES

Jerseys oficiales 25/26, equipación de entrenamiento y mercancía del 110 aniversario rojinegro.
Envíos a toda la República.

Atlas FC — Bannerweb
// Rellena .swiper-wrapper.matches e inicializa Swiper propio (function () { 'use strict'; var BASE = 'https://webws.365scores.com/web/'; var ATLAS_ID = 1258; var COMP = 141; var QS = 'appTypeId=5&langId=29&timezoneName=America%2FMexico_City&userCountryId=31'; var ABBR = { 'Atlas': 'ATLAS FC', 'Chivas de Guadalajara': 'CHIVAS', 'Cruz Azul': 'CRUZ AZUL', 'Club América': 'AMÉRICA', 'Tigres UANL': 'TIGRES', 'Pumas UNAM': 'PUMAS', 'Toluca': 'TOLUCA', 'Pachuca': 'PACHUCA', 'Santos Laguna': 'SANTOS', 'León': 'LEÓN', 'Mazatlán FC': 'MAZATLÁN', 'Atlético San Luis': 'SAN LUIS', 'Monterrey': 'MONTERREY', 'Necaxa': 'NECAXA', 'Querétaro FC': 'QUERÉTARO', 'Puebla': 'PUEBLA', 'FC Juárez': 'JUÁREZ', 'Club Tijuana': 'TIJUANA', }; var liveInterval = null; /* ── Helpers ─────────────────────────────────────────────────── */ function abbr(name) { return ABBR[name] || name.toUpperCase().slice(0, 8); } function roundLabel(g) { if (g.roundNum != null) return 'J' + g.roundNum; var s = (g.stageName || '').toLowerCase(); var leg = g._leg === 2 ? 'VUELTA' : 'IDA'; if (s.indexOf('cuartos') !== -1) return 'CUARTOS · ' + leg; if (s.indexOf('semi') !== -1) return 'SEMIS · ' + leg; if (s.indexOf('final') !== -1) return 'FINAL · ' + leg; return (g.stageName || '').toUpperCase(); } function assignLegs(games) { var count = {}; return games.map(function (g) { if (g.roundNum == null && g.stageName) { count[g.stageName] = (count[g.stageName] || 0) + 1; return Object.assign({}, g, { _leg: count[g.stageName] }); } return g; }); } function isAtlas(g) { return (g.homeCompetitor && g.homeCompetitor.id === ATLAS_ID) || (g.awayCompetitor && g.awayCompetitor.id === ATLAS_ID); } function notApertura(g) { return (g.stageName || '').toLowerCase().indexOf('apertura') === -1; } /* ── HTML con clases de Webflow ──────────────────────────────── */ function renderSlide(g, isCurrent) { var h = g.homeCompetitor; var a = g.awayCompetitor; var done = g.statusGroup === 4; var live = g.statusGroup === 3; var scoreStr = (done || live) ? (h.score || 0) + '-' + (a.score || 0) : 'VS'; var badgeHtml = ''; if (live) { badgeHtml = '
' + '

' + (g.shortStatusText || 'EN VIVO') + '

' + '
'; } else if (isCurrent && !done) { badgeHtml = '
' + '

próximo

' + '
'; } var containerClass = isCurrent ? 'vertical-match-container-current' : 'vertical-match-container'; return ( '
' + '
' + '

' + roundLabel(g) + '

' + '
' + '

' + abbr(h.name) + '

' + '

' + scoreStr + '

' + '

' + abbr(a.name) + '

' + '
' + badgeHtml + '
' + '
' ); } /* ── Fetch ───────────────────────────────────────────────────── */ function fetchAll() { return Promise.all([ fetch(BASE + 'games/results?competitions=' + COMP + '&competitors=' + ATLAS_ID + '&' + QS) .then(function (r) { return r.json(); }), fetch(BASE + 'games/current?competitions=' + COMP + '&' + QS) .then(function (r) { return r.json(); }), ]).then(function (results) { var past = (results[0].games || []).filter(function (g) { return isAtlas(g) && notApertura(g); }); var seen = {}; past.forEach(function (g) { seen[g.id] = true; }); var current = (results[1].games || []).filter(function (g) { return isAtlas(g) && notApertura(g) && !seen[g.id]; }); var all = past.concat(current).sort(function (a, b) { return new Date(a.startTime) - new Date(b.startTime); }); return assignLegs(all); }); } /* ── Render principal ────────────────────────────────────────── */ function render() { var swiperEl = document.querySelector('.swiper-matches'); if (!swiperEl) { console.warn('Atlas ticker: no se encontró .swiper-matches'); return; } var wrapper = swiperEl.querySelector('.swiper-wrapper'); if (!wrapper) { console.warn('Atlas ticker: no se encontró .swiper-wrapper dentro de .swiper-matches'); return; } fetchAll().then(function (games) { if (!games.length) { console.warn('Atlas ticker: API no devolvió partidos'); return; } var live = games.filter(function (g) { return g.statusGroup === 3; }); var upcoming = games.filter(function (g) { return g.statusGroup === 1 || g.statusGroup === 2; }); var current = live[0] || upcoming[0] || null; var currentId = current ? current.id : null; // Polling en vivo if (live.length && !liveInterval) { liveInterval = setInterval(render, 30000); } else if (!live.length && liveInterval) { clearInterval(liveInterval); liveInterval = null; } // Índice scroll var currentIndex = 0; for (var i = 0; i < games.length; i++) { if (games[i].id === currentId) { currentIndex = i; break; } } var scrollIndex; if (live.length) { scrollIndex = currentIndex; } else if (upcoming.length && currentIndex > 0) { scrollIndex = currentIndex - 1; } else { scrollIndex = Math.max(0, games.length - 1); } // Poblar slides wrapper.innerHTML = games.map(function (g) { return renderSlide(g, g.id === currentId); }).join(''); // Destruir instancia previa si existe if (swiperEl.swiper) { try { swiperEl.swiper.destroy(true, true); } catch (e) {} } // Inicializar Swiper if (typeof Swiper !== 'undefined') { // cssMode = scroll nativo: soporta swipe con dedo en mobile // sin JS adicional y compatible con "transform:none !important" var sw = new Swiper(swiperEl, { slidesPerView: 'auto', spaceBetween: 0, cssMode: true, navigation: { nextEl: swiperEl.querySelector('.swiper-button-next'), prevEl: swiperEl.querySelector('.swiper-button-prev'), }, }); sw.slideTo(scrollIndex, 0); } else { // Fallback sin Swiper: scroll nativo console.warn('Atlas ticker: Swiper no disponible, usando scroll nativo'); wrapper.style.cssText = 'display:flex;overflow-x:auto;scrollbar-width:none;scroll-behavior:smooth'; var target = wrapper.children[scrollIndex]; if (target) setTimeout(function () { target.scrollIntoView({ behavior: 'instant', inline: 'start', block: 'nearest' }); }, 50); } }).catch(function (e) { console.error('Atlas ticker error:', e); }); } /* ── Init ────────────────────────────────────────────────────── */ if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', render); } else { render(); } })(); /** * tabla.js — Tabla General Liga MX con Atlas sticky bidireccional * Webflow: Page Settings > Before (home/index) */ (function () { 'use strict'; const TEAM_ID = 1258; const BASE_PARAMS = { appTypeId: 5, langId: 29, timezoneName: 'America/Mexico_City', userCountryId: 31, }; async function api(endpoint, extra = {}) { const params = new URLSearchParams({ ...BASE_PARAMS, ...extra }).toString(); const res = await fetch(`https://webws.365scores.com/web/${endpoint}/?${params}`); return res.json(); } function teamLogo(id) { return `https://imagecache.365scores.com/image/upload/f_png,w_150,h_150,c_limit,q_auto:best,d_Competitors:default1.png/v5/Competitors/${id}`; } const SHORT_NAMES = { 'Chivas de Guadalajara': 'Chivas', 'U.A.N.L. - Tigres': 'Tigres', 'Tigres UANL': 'Tigres', 'Santos Laguna': 'Santos', 'Club Tijuana': 'Tijuana', 'Atlético San Luis': 'Atl. San Luis', 'Atlético de San Luis': 'Atl. San Luis', 'Club América': 'América', 'Mazatlán FC': 'Mazatlán', 'FC Juárez': 'Juárez', 'Querétaro FC': 'Querétaro', 'Pumas UNAM': 'Pumas', }; function shortName(name) { return SHORT_NAMES[name] || name; } function atlasRowHtml(row, extraClasses) { const comp = row.competitor || {}; const diff = row.ratio >= 0 ? `+${Math.round(row.ratio)}` : `${Math.round(row.ratio)}`; return `

${row.position}

${comp.name || ''}

${shortName(comp.name || '')}

${Math.round(row.gamePlayed)}

${Math.round(row.gamesWon)}

${Math.round(row.gamesEven)}

${Math.round(row.gamesLost)}

${Math.round(row.for)}

${Math.round(row.against)}

${diff}

${Math.round(row.points)}

`; } function normalRowHtml(row) { const comp = row.competitor || {}; const diff = row.ratio >= 0 ? `+${Math.round(row.ratio)}` : `${Math.round(row.ratio)}`; return `

${row.position}

${comp.name || ''}

${shortName(comp.name || '')}

${Math.round(row.gamePlayed)}

${Math.round(row.gamesWon)}

${Math.round(row.gamesEven)}

${Math.round(row.gamesLost)}

${Math.round(row.for)}

${Math.round(row.against)}

${diff}

${Math.round(row.points)}

`; } function createStickyEl(html, stickySide) { const temp = document.createElement('div'); temp.innerHTML = html; const el = temp.firstElementChild; el.style.position = 'sticky'; el.style[stickySide] = '0'; el.style.zIndex = '10'; el.style.display = 'none'; return el; } function injectStyles() { if (document.getElementById('atl-standings-css')) return; const style = document.createElement('style'); style.id = 'atl-standings-css'; style.textContent = ` .grid-main-resultados .icon-1x1-medium { width: 32px; height: 32px; object-fit: contain; } @media (max-width: 767px) { .grid-main-resultados .resultados-container-small { min-width: 40px; padding: 10px 8px; } .grid-main-resultados .resultados-container-medium { min-width: 0; flex: 1; } .grid-main-resultados .icon-1x1-medium { width: 24px; height: 24px; } .row-team-resultados > :nth-child(5), .row-team-resultados > :nth-child(6), .row-team-resultados > :nth-child(7), .row-team-resultados > :nth-child(8), .row-team-resultados > :nth-child(9), .header-text-resultados > :nth-child(5), .header-text-resultados > :nth-child(6), .header-text-resultados > :nth-child(7), .header-text-resultados > :nth-child(8), .header-text-resultados > :nth-child(9) { display: none; } } @media (max-width: 479px) { .grid-main-resultados .resultados-container-small { min-width: 40px; padding: 8px 4px; } .grid-main-resultados .resultados-container-small p { font-size: 12px; } .grid-main-resultados .resultados-container-medium { gap: 6px; } .grid-main-resultados .icon-1x1-medium { width: 20px; height: 20px; } .grid-main-resultados .no-break { font-size: 12px; } } `; document.head.appendChild(style); } async function init() { const grid = document.querySelector('.grid-main-resultados'); if (!grid) return; injectStyles(); try { const data = await api('standings', { competitions: 141 }); const rows = data.standings?.[0]?.rows || []; if (!rows.length) return; const mobileHeader = grid.querySelector('.header-text-resultados.mobile'); grid.querySelectorAll('.row-team-resultados').forEach(el => el.remove()); const atlasData = rows.find(r => r.competitor?.id === TEAM_ID); const allHtml = rows.map(r => r.competitor?.id === TEAM_ID ? atlasRowHtml(r, 'atl-natural-row') : normalRowHtml(r) ).join(''); if (mobileHeader) { mobileHeader.insertAdjacentHTML('afterend', allHtml); } else { grid.insertAdjacentHTML('beforeend', allHtml); } if (!atlasData) return; const rowHtml = atlasRowHtml(atlasData, ''); const stickyTop = createStickyEl(rowHtml, 'top'); const naturalRow = grid.querySelector('.atl-natural-row'); grid.insertBefore(stickyTop, naturalRow ? naturalRow : grid.firstChild); const stickyBottom = createStickyEl(rowHtml, 'bottom'); grid.appendChild(stickyBottom); if (!naturalRow || !('IntersectionObserver' in window)) return; const scrollRoot = grid.closest('.container-resultados-grid'); let gridInView = false; new IntersectionObserver( ([entry]) => { gridInView = entry.isIntersecting; }, { threshold: 0 } ).observe(grid); new IntersectionObserver( ([entry]) => { if (!gridInView) { stickyTop.style.display = 'none'; stickyBottom.style.display = 'none'; return; } if (entry.isIntersecting) { stickyTop.style.display = 'none'; stickyBottom.style.display = 'none'; } else { const rootTop = entry.rootBounds?.top ?? 0; const rootBottom = entry.rootBounds?.bottom ?? window.innerHeight; const rowCenter = (entry.boundingClientRect.top + entry.boundingClientRect.bottom) / 2; if (rowCenter < rootTop) { stickyTop.style.display = ''; stickyBottom.style.display = 'none'; } else if (rowCenter > rootBottom) { stickyTop.style.display = 'none'; stickyBottom.style.display = ''; } } }, { root: scrollRoot, threshold: 0 } ).observe(naturalRow); } catch (err) { console.error('[Atlas Standings] Error:', err); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); /** * goleadores.js — Top 5 goleadores de Atlas + Datos Clave */ (function () { 'use strict'; const TEAM_ID = 1258; const COMPETITION_ID = 141; const ROJO_ATLAS = '#f70004'; const BASE_PARAMS = { appTypeId: 5, langId: 29, timezoneName: 'America/Mexico_City', userCountryId: 31, }; async function api(endpoint, extra = {}) { const params = new URLSearchParams({ ...BASE_PARAMS, ...extra }).toString(); const res = await fetch(`https://webws.365scores.com/web/${endpoint}/?${params}`); return res.json(); } function playerImg(id) { return `https://imagecache.365scores.com/image/upload/f_png,w_200,h_200,c_limit,q_auto:best,d_Athletes:default.png/v5/Athletes/${id}`; } const SHORT_NAMES = { 'Chivas de Guadalajara': 'Chivas', 'U.A.N.L. - Tigres': 'Tigres', 'Santos Laguna': 'Santos', 'Club Tijuana': 'Tijuana', 'Atlético San Luis': 'Atl. San Luis', 'Atlético de San Luis': 'Atl. San Luis', 'Club América': 'América', 'Mazatlán FC': 'Mazatlán', 'FC Juárez': 'Juárez', 'Querétaro FC': 'Querétaro', 'Pumas UNAM': 'Pumas', }; function shortName(name) { return SHORT_NAMES[name] || name; } function buildLastGoalMap(pastGames) { const map = {}; for (const game of pastGames) { const events = game.events || []; const isHome = game.homeCompetitor?.id === TEAM_ID; const opponent = isHome ? game.awayCompetitor?.name : game.homeCompetitor?.name; const round = game.roundNum; for (const evt of events) { if (evt.eventType?.id === 1 && evt.competitorId === TEAM_ID && evt.playerId) { if (!map[evt.playerId]) { map[evt.playerId] = { opponent: shortName(opponent), round }; } } } } return map; } function renderGoleadores(golesCat, pastGames) { const container = document.querySelector('.tabla-metricas-1'); if (!container) return; const rows = (golesCat?.rows || []) .filter(r => r.entity?.competitorId === TEAM_ID && !r.entity?.isLeftClub) .filter((r, i, self) => i === self.findIndex(t => t.entity?.id === r.entity?.id)) .slice(0, 5); if (!rows.length) return; const lastGoalMap = buildLastGoalMap(pastGames); const header = container.querySelector('.header-resultados'); container.querySelectorAll('.container-metrics-goleador').forEach(c => c.remove()); let html = ''; rows.forEach((row, idx) => { const rank = idx + 1; const isTop = rank === 1; const player = row.entity || {}; const goals = row.stats?.[0]?.value ?? 0; const lastGoal = lastGoalMap[player.id]; const subtitle = lastGoal ? `${goals} gol${goals != 1 ? 'es' : ''} · Último: vs ${lastGoal.opponent}` : `${goals} gol${goals != 1 ? 'es' : ''}`; const rankClass = isTop ? 'title-style-2' : 'title-style-2 grey'; const rankStyle = isTop ? `style="color:${ROJO_ATLAS}"` : ''; const nameClass = isTop ? 'title-style-3' : 'title-style-3 black'; const nameStyle = isTop ? `style="color:${ROJO_ATLAS}"` : ''; html += `
${rank}
${player.name || ''}

${player.name || ''}

${subtitle}

`; }); if (header) { header.insertAdjacentHTML('afterend', html); } else { container.insertAdjacentHTML('beforeend', html); } } function renderMetrics(statsData, standingsData) { const wrapper = document.querySelector('.wrapper-metrics'); if (!wrapper) return; const allStandings = standingsData?.standings || []; const regularSeason = allStandings.reduce((best, s) => { const gp = s?.rows?.[0]?.gamePlayed || 0; const bestGp = best?.rows?.[0]?.gamePlayed || 0; return gp > bestGp ? s : best; }, allStandings[0] || {}); const standingsRows = regularSeason?.rows || []; const atlasRow = standingsRows.find(r => r.competitor?.id === TEAM_ID); if (!atlasRow) return; const played = atlasRow.gamePlayed || 1; const atlasGF = Math.round(atlasRow.for || 0); const ath = statsData?.athletesStats || []; const xgCat = ath.find(c => c.id === 2); let totalXg = 0; if (xgCat?.rows) { for (const r of xgCat.rows) { if (r.entity?.competitorId === TEAM_ID && !r.entity?.isLeftClub) { totalXg += parseFloat(r.stats?.[0]?.value || 0); } } } const xgPerGame = (totalXg / played).toFixed(2); let leagueGF = 0, leagueGP = 0; for (const r of standingsRows) { leagueGF += r.for || 0; leagueGP += r.gamePlayed || 0; } const leagueGpG = leagueGP ? leagueGF / leagueGP : 1.3; const xgDiffNum = parseFloat(xgPerGame) - leagueGpG; const xgDiffStr = xgDiffNum >= 0 ? `+${xgDiffNum.toFixed(2)}` : xgDiffNum.toFixed(2); const xgNote = `${xgDiffStr} vs promedio de liga (${leagueGpG.toFixed(2)} xG/pj)`; const xgPct = Math.min(100, Math.round((parseFloat(xgPerGame) / 3) * 100)); const sortedByGF = [...standingsRows].sort((a, b) => (b.for || 0) - (a.for || 0)); const gfRank = sortedByGF.findIndex(r => r.competitor?.id === TEAM_ID) + 1; const leaderGF = Math.round(sortedByGF[0]?.for || 1); const gapToLeader = leaderGF - atlasGF; const gfNote = gfRank === 1 ? `Líder goleador de la liga` : gfRank <= 3 ? `Top ${gfRank} en goles — a ${gapToLeader} del líder` : `#${gfRank} en goles — a ${gapToLeader} del líder (${leaderGF} GF)`; const gfPct = Math.min(100, Math.round((atlasGF / leaderGF) * 100)); const golesPerGame = (atlasGF / played).toFixed(2); const gpgDiffNum = parseFloat(golesPerGame) - leagueGpG; const gpgDiffStr = gpgDiffNum >= 0 ? `+${gpgDiffNum.toFixed(2)}` : gpgDiffNum.toFixed(2); const sortedByGpG = [...standingsRows] .map(r => ({ id: r.competitor?.id, gpg: (r.for || 0) / (r.gamePlayed || 1) })) .sort((a, b) => b.gpg - a.gpg); const gpgRank = sortedByGpG.findIndex(r => r.id === TEAM_ID) + 1; const gpgNote = `${gpgDiffStr} vs liga · #${gpgRank} en efectividad ofensiva`; const gpgPct = Math.min(100, Math.round((parseFloat(golesPerGame) / (sortedByGpG[0]?.gpg || 1)) * 100)); wrapper.innerHTML = `
expectativa de goles
${xgPerGame}

xG / partido

${xgNote}

goles a favor
${atlasGF}

en ${played} partidos

${gfNote}

goles por partido
${golesPerGame}

promedio

${gpgNote}

`; } function injectStyles() { if (document.getElementById('atl-stats-css')) return; const style = document.createElement('style'); style.id = 'atl-stats-css'; style.textContent = ` /* Goleadores */ .tabla-metricas-1 .icon-embed-xlarge { border-radius: 8px; overflow: hidden; } @media (max-width: 767px) { .tabla-metricas-1 .container-metrics-goleador { padding: 16px; gap: 1rem; } .tabla-metricas-1 .icon-embed-xlarge { width: 56px; height: 72px; min-width: 56px; } } @media (max-width: 479px) { .tabla-metricas-1 .container-metrics-goleador { padding: 14px; gap: 0.875rem; } .tabla-metricas-1 .icon-embed-xlarge { width: 52px; height: 68px; min-width: 52px; } } .wrapper-metrics { display: flex !important; } .wrapper-metrics .chip-container { display: flex; align-items: baseline; gap: 8px; } .wrapper-metrics h5 { color: var(--_colors---negro-atlas, #1a1a1a) !important; } `; document.head.appendChild(style); } async function init() { try { const isAtlas = g => g.homeCompetitor?.id === TEAM_ID || g.awayCompetitor?.id === TEAM_ID; const [statsRes, resultsRes, standingsRes] = await Promise.all([ api('stats', { competitions: COMPETITION_ID, competitors: TEAM_ID }), api('games/results', { competitions: COMPETITION_ID, competitors: TEAM_ID }), api('standings', { competitions: COMPETITION_ID }), ]); const allResults = (resultsRes.games || []).filter(g => isAtlas(g)); const pastGames = allResults .filter(g => (g.stageName || '').toLowerCase() === 'clausura') .sort((a, b) => new Date(b.startTime) - new Date(a.startTime)); const stats = statsRes.stats || {}; const golesCat = (stats.athletesStats || []).find(c => c.id === 1); renderGoleadores(golesCat, pastGames); renderMetrics(stats, standingsRes); } catch (err) { console.error('[Atlas Stats] Error:', err); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { injectStyles(); init(); }); } else { injectStyles(); init(); } })();