Classement
Résultats
Calendrier
Statistiques
Statistiques Japan Rugby League One, la plus haute division de rugby en France, incluant les matchs joués, les pourcentages de victoires à domicile et à l’extérieur, les points marqués, les essais, les cartons, et bien plus encore.
Statistiques Japan Rugby League One
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: ‘Poppins’, -apple-system, BlinkMacSystemFont, ‘Segoe UI’, Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background-color: #f8fafc;
}
.rugby-stats-widget {
max-width: 1200px;
margin: 20px auto;
padding: 20px;
background-color: #f8fafc;
}
/* Header style inspiré de competition.html */
.widget-header {
background: linear-gradient(135deg, #374151 0%, #1f2937 100%);
color: white;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
text-align: center;
box-shadow: 0 4px 16px rgba(31, 41, 55, 0.3);
}
.widget-header h1 {
font-size: 1.8rem;
margin-bottom: 5px;
font-weight: 600;
}
.widget-header p {
opacity: 0.9;
font-size: 0.9rem;
}
/* Statistiques générales en cartes */
.stats-grid {
display: flex;
flex-wrap: wrap;
gap: 15px;
margin-bottom: 30px;
justify-content: center;
}
.stat-card {
background: white;
border: 2px solid #e5e7eb;
border-radius: 10px;
padding: 20px;
text-align: center;
transition: all 0.3s ease;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
width: 300px;
flex-shrink: 0;
}
.stat-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
border-color: #374151;
}
.stat-card h3 {
font-size: 0.8rem;
margin-bottom: 8px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: #6b7280;
font-weight: 500;
}
.stat-card .stat-value {
font-size: 2rem;
font-weight: bold;
margin-bottom: 5px;
color: #374151;
}
.stat-card .stat-unit {
font-size: 0.8rem;
color: #6b7280;
}
/* Cartes enrichies */
.stat-card-large {
padding: 25px;
}
.multi-stats {
display: flex;
flex-direction: column;
gap: 15px;
}
.main-stat {
text-align: center;
}
.main-stat .stat-value {
font-size: 2.2rem;
font-weight: bold;
color: #374151;
margin-bottom: 5px;
}
.main-stat .stat-unit {
font-size: 0.9rem;
color: #6b7280;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.sub-stats {
display: flex;
justify-content: space-around;
gap: 10px;
}
.sub-stat {
display: flex;
flex-direction: column;
align-items: center;
flex: 1;
padding: 10px 8px;
background: #f9fafb;
border-radius: 6px;
border: 1px solid #e5e7eb;
min-height: 60px;
justify-content: center;
}
.sub-stat.yellow {
background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
border-color: #d97706;
color: white;
}
.sub-stat.red {
background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);
border-color: #991b1b;
color: white;
}
.sub-stat.kicking {
background: linear-gradient(135deg, #0288d1 0%, #0277bd 100%);
border-color: #01579b;
color: white;
}
.sub-stat.tries {
background: linear-gradient(135deg, #388e3c 0%, #2e7d32 100%);
border-color: #1b5e20;
color: white;
}
.sub-stat.tactical-offense {
background: linear-gradient(135deg, #fff3e0 0%, #ffe0b2 100%);
border-color: #f57c00;
}
.sub-stat.tactical-defense {
background: linear-gradient(135deg, #f3e5f5 0%, #e1bee7 100%);
border-color: #7b1fa2;
}
/* Barres de progression et indicateurs visuels */
.progress-bar-container {
width: 100%;
height: 6px;
background: #e5e7eb;
border-radius: 3px;
margin-top: 5px;
overflow: hidden;
}
.sub-stat.kicking .progress-bar-container,
.sub-stat.tries .progress-bar-container {
background: rgba(255, 255, 255, 0.3);
}
.progress-bar {
height: 100%;
border-radius: 3px;
transition: width 1s ease-in-out;
}
.progress-bar.offense {
background: linear-gradient(90deg, #f59e0b 0%, #f97316 100%);
}
.progress-bar.defense {
background: linear-gradient(90deg, #7b1fa2 0%, #9c27b0 100%);
}
.progress-bar.kicking {
background: linear-gradient(90deg, #ffffff 0%, #e3f2fd 100%);
}
.progress-bar.tries {
background: linear-gradient(90deg, #ffffff 0%, #e8f5e8 100%);
}
.performance-indicator {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 0.7rem;
color: #6b7280;
margin-top: 3px;
}
.indicator-dot {
width: 6px;
height: 6px;
border-radius: 50%;
}
.indicator-dot.excellent {
background: #10b981;
}
.indicator-dot.good {
background: #f59e0b;
}
.indicator-dot.average {
background: #ef4444;
}
.sub-value {
font-size: 1.1rem;
font-weight: bold;
color: #374151;
margin-bottom: 2px;
}
.sub-label {
font-size: 0.7rem;
color: #6b7280;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.sub-stat.yellow .sub-value,
.sub-stat.red .sub-value,
.sub-stat.kicking .sub-value,
.sub-stat.tries .sub-value {
color: white;
}
.sub-stat.yellow .sub-label,
.sub-stat.red .sub-label,
.sub-stat.kicking .sub-label,
.sub-stat.tries .sub-label {
color: rgba(255, 255, 255, 0.8);
}
.card-footer {
text-align: center;
font-size: 0.8rem;
color: #6b7280;
font-style: italic;
padding-top: 5px;
border-top: 1px solid #e5e7eb;
}
/* Sections de classements unifiés */
.rankings-unified {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
justify-items: center;
}
/* Conteneur de classement style phase */
.ranking-container {
background: white;
border: 2px solid #e5e7eb;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
margin-bottom: 20px;
width: 100%;
max-width: 500px;
}
.ranking-header {
background: linear-gradient(135deg, #004382 0%, #003770 100%);
color: white;
padding: 15px 20px;
font-weight: bold;
display: flex;
justify-content: space-between;
align-items: center;
}
.ranking-title {
display: flex;
align-items: center;
gap: 10px;
}
.expand-btn {
background: rgba(255,255,255,0.2);
border: 1px solid rgba(255,255,255,0.3);
color: white;
padding: 6px 12px;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
font-weight: 500;
transition: all 0.3s ease;
}
.expand-btn:hover {
background: rgba(255,255,255,0.3);
transform: translateY(-1px);
}
.expand-btn.expanded {
background: rgba(255,255,255,0.25);
}
.ranking-content {
padding: 0;
}
/* Items de classement */
.ranking-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 20px;
border-bottom: 1px solid #e5e7eb;
transition: all 0.2s ease;
position: relative;
}
.ranking-item:last-child {
border-bottom: none;
}
.ranking-item:hover {
background: #f9fafb;
}
/* Couleurs pour le podium */
.ranking-item:nth-child(1) { border-left: 4px solid #fbbf24; background: linear-gradient(to right, #fef3c7 0%, transparent 100%); }
.ranking-item:nth-child(2) { border-left: 4px solid #9ca3af; background: linear-gradient(to right, #e5e7eb 0%, transparent 100%); }
.ranking-item:nth-child(3) { border-left: 4px solid #cd7c2f; background: linear-gradient(to right, #fed7aa 0%, transparent 100%); }
.item-info {
display: flex;
align-items: center;
gap: 12px;
flex: 1;
}
.item-info .team-logo {
width: 24px;
height: 24px;
border-radius: 4px;
background: #f3f4f6;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
color: #6b7280;
font-size: 0.8rem;
min-width: 24px;
}
.item-rank {
background: #374151;
color: white;
width: 24px;
height: 24px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 0.8rem;
min-width: 24px;
}
/* Rangs spéciaux pour le podium */
.ranking-item:nth-child(1) .item-rank { background: #fbbf24; }
.ranking-item:nth-child(2) .item-rank { background: #9ca3af; color: white; }
.ranking-item:nth-child(3) .item-rank { background: #cd7c2f; }
.item-details {
flex: 1;
}
.item-name {
font-weight: 600;
font-size: 0.95rem;
color: #111827;
margin-bottom: 2px;
}
.item-team {
font-size: 0.75rem;
color: #6b7280;
}
.item-stats {
text-align: right;
}
.item-primary {
font-size: 1.1rem;
font-weight: bold;
color: #374151;
}
.item-secondary {
font-size: 0.75rem;
color: #6b7280;
}
/* Animation pour l’expansion */
.ranking-content {
max-height: 240px; /* Affiche environ 5 items */
overflow: hidden;
transition: max-height 0.4s ease-in-out;
}
.ranking-content.expanded {
max-height: 1000px; /* Assez grand pour 20+ items */
}
/* Loading et error states */
.loading {
text-align: center;
padding: 50px;
font-size: 1.1rem;
color: #6b7280;
background: white;
border-radius: 8px;
border: 2px solid #e5e7eb;
}
.error {
text-align: center;
padding: 50px;
color: #dc2626;
font-size: 1.1rem;
background: white;
border-radius: 8px;
border: 2px solid #e5e7eb;
}
/* Styles pour les matchs en direct */
.live-matches {
background: white;
border: 2px solid #e5e7eb;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.live-header {
background: linear-gradient(135deg, #004382 0%, #003770 100%);
color: white;
padding: 15px 20px;
font-weight: bold;
display: flex;
justify-content: space-between;
align-items: center;
}
.live-indicator {
display: flex;
align-items: center;
gap: 8px;
}
.live-dot {
width: 8px;
height: 8px;
background: white;
border-radius: 50%;
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { opacity: 1; }
50% { opacity: 0.5; }
100% { opacity: 1; }
}
.match-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 20px;
border-bottom: 1px solid #e5e7eb;
transition: background 0.2s ease;
}
.match-item:last-child {
border-bottom: none;
}
.match-item:hover {
background: #f9fafb;
}
.match-teams {
display: flex;
align-items: center;
gap: 15px;
flex: 1;
}
.team {
display: flex;
align-items: center;
gap: 8px;
min-width: 120px;
}
.team-logo-small {
width: 20px;
height: 20px;
border-radius: 3px;
background: #f3f4f6;
}
.vs {
font-weight: bold;
color: #6b7280;
font-size: 0.8rem;
}
.match-score {
font-size: 1.2rem;
font-weight: bold;
color: #dc2626;
min-width: 60px;
text-align: center;
}
.match-status {
padding: 4px 8px;
border-radius: 4px;
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
min-width: 80px;
text-align: center;
}
.status-live {
background: #dc2626;
color: white;
}
.status-halftime {
background: #f59e0b;
color: white;
}
.status-finished {
background: #10b981;
color: white;
}
.status-scheduled {
background: #6b7280;
color: white;
}
.no-live-matches {
padding: 30px 20px;
text-align: center;
color: #6b7280;
font-style: italic;
}
.team-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 20px;
border-bottom: 1px solid #e5e7eb;
transition: background 0.2s ease;
}
.team-item:last-child {
border-bottom: none;
}
.team-item:hover {
background: #f9fafb;
}
.team-info {
display: flex;
align-items: center;
gap: 12px;
flex: 1;
}
.team-logo {
width: 32px;
height: 32px;
border-radius: 4px;
background: #f3f4f6;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
color: #6b7280;
font-size: 0.8rem;
}
.team-name {
font-weight: 600;
color: #111827;
}
.team-stat {
font-size: 1.1rem;
font-weight: bold;
color: #374151;
}
/* Responsive design */
@media (max-width: 768px) {
.rugby-stats-widget {
margin: 10px;
padding: 15px;
}
.widget-header h1 {
font-size: 1.5rem;
}
.stats-grid {
gap: 10px;
}
.stat-card {
width: 280px;
}
.rankings-unified {
grid-template-columns: 1fr;
gap: 15px;
}
.ranking-item {
padding: 10px 15px;
}
.item-name {
font-size: 0.85rem;
}
.item-team {
font-size: 0.7rem;
}
}
@media (max-width: 480px) {
.rugby-stats-widget {
margin: 5px;
padding: 10px;
}
.stats-grid {
gap: 12px;
}
.stat-card {
width: 100%;
max-width: 280px;
padding: 12px 8px;
min-width: 0;
}
.stat-card-large {
padding: 20px 15px;
}
.stat-card h3 {
font-size: 0.8rem;
margin-bottom: 8px;
}
.stat-card .stat-value {
font-size: 1.3rem;
margin-bottom: 3px;
}
.main-stat .stat-value {
font-size: 1.8rem;
}
.sub-stats {
gap: 8px;
}
.sub-stat {
padding: 8px 6px;
}
.sub-value {
font-size: 1rem;
}
.sub-label {
font-size: 0.65rem;
}
}
// Configuration de l’API
const API_BASE_URL = ‘https://rugby-app-4ebacff10fda.herokuapp.com’;
const COMPETITION_NAME = ‘japan-league-one’;
async function loadStats() {
const widgetContent = document.getElementById(‘widgetContent’);
try {
widgetContent.innerHTML = ‘
Chargement des statistiques…
‘;
// Charger les statistiques et les scores en parallèle
const [statsResponse, liveResponse] = await Promise.all([
fetch(`${API_BASE_URL}/competitions/${COMPETITION_NAME}`),
fetch(`${API_BASE_URL}/competitions/${COMPETITION_NAME}/live_scores`)
]);
if (!statsResponse.ok) {
throw new Error(‘Erreur lors du chargement des données’);
}
const stats = await statsResponse.json();
const liveData = liveResponse.ok ? await liveResponse.json() : { live_scores: [] };
displayStats(stats);
displayLiveScores(liveData.live_scores || []);
} catch (error) {
console.error(‘Erreur:’, error);
widgetContent.innerHTML = `
Impossible de charger les statistiques.
Veuillez réessayer plus tard.
Erreur: ${error.message}
`;
}
}
function displayStats(stats) {
const widgetContent = document.getElementById(‘widgetContent’);
// Les données des joueurs contiennent déjà les informations des équipes
// Pas besoin de mapping manuel, l’API retourne team_name et team_img_url
widgetContent.innerHTML = `
Saison en Chiffres
${stats.nombre_de_matchs_joues || 0}
matchs joués
${stats.points_marques || 0}
points marqués
${parseFloat(stats.moyenne_points_par_match || 0).toFixed(1)}
pts/match
Performance Offensive
${stats.nombre_essais || 0}
essais marqués
${parseFloat(stats.moyenne_essais_par_match || 0).toFixed(1)}
essais/match
${stats.nombre_essais > 0 ? (parseFloat(stats.points_marques || 0) / parseFloat(stats.nombre_essais || 1)).toFixed(1) : 0}
pts/essai
Avantage Terrain
${Math.round(parseFloat(stats.pourcentage_victoires_domicile || 0)) – Math.round(parseFloat(stats.pourcentage_victoires_exterieur || 0))}%
écart dom./ext.
${Math.round(parseFloat(stats.pourcentage_victoires_domicile || 0))}%
domicile
${Math.round(parseFloat(stats.pourcentage_victoires_exterieur || 0))}%
extérieur
Discipline
${(stats.nombre_cartons_jaune || 0) + (stats.nombre_cartons_rouge || 0)}
cartons total
${stats.nombre_cartons_jaune || 0}
jaunes
${stats.nombre_cartons_rouge || 0}
rouges
Précision au Pied
${calculateKickingStats(stats).totalKickingPoints}
points au pied
${calculateKickingStats(stats).kickingPercentage}%
points au pied
${calculateKickingStats(stats).triesPercentage}%
points essais
${renderPlayerRanking(stats.classement_joueurs_essais, ‘essais’, ‘essai(s)’)}
${renderPlayerRanking(stats.classement_joueurs_points, ‘points’, ‘pt(s)’)}
${renderKickingSpecialists(stats.classement_joueurs_points)}
${renderTeamRanking(stats.meilleure_attaque, ‘buts_marques’, ‘pts marqués’)}
${renderTeamRanking(stats.meilleure_defense, ‘buts_encaisses’, ‘pts encaissés’)}
${renderTeamRanking(stats.classement_cartons_jaunes, ‘cartons_jaunes’, ‘jaune(s)’)}
`;
}
function renderPlayerRanking(players, statKey, unit) {
if (!players || !Array.isArray(players)) return ‘
‘;
return players.slice(0, 20).map((player, index) => {
const [name, stats] = player;
const primaryStat = stats[statKey] || 0;
const secondaryStat = statKey === ‘essais’ ? (stats.points || 0) + ‘ pts’ : (stats.essais || 0) + ‘ essais’;
return `
${index + 1}
${stats.team_img_url ? `
` : (stats.team_name || ‘E’).charAt(0)}
${name}
${stats.team_name || ‘Équipe inconnue’}
${primaryStat} ${unit}
${secondaryStat}
`;
}).join( »);
}
function renderTeamRanking(teams, statKey, unit) {
if (!teams || !Array.isArray(teams)) return ‘
‘;
// Vérifier si toutes les valeurs sont à 0
const hasNonZeroValues = teams.some(team => (team[statKey] || 0) > 0);
return teams.slice(0, 15).map((team, index) => {
const statValue = team[statKey] || 0;
return `
${team.image ? `
` : team.nom.charAt(0)}
${team.nom}
${statValue} ${unit}
${!hasNonZeroValues && statKey === ‘buts_marques’ ? ‘
Saison débutante
‘ : »}
`;
}).join( »);
}
function calculateKickingStats(stats) {
if (!stats.classement_joueurs_points || !Array.isArray(stats.classement_joueurs_points)) {
return { totalKickingPoints: 0, kickingPercentage: 0, triesPercentage: 0, gameStyle: ‘Données indisponibles’ };
}
let totalPoints = 0;
let totalKickingPoints = 0;
let totalTriesPoints = 0;
stats.classement_joueurs_points.forEach(([nom, playerStats]) => {
const points = playerStats.points || 0;
const essais = playerStats.essais || 0;
const pointsEssais = essais * 5;
const pointsPied = points – pointsEssais;
totalPoints += points;
totalKickingPoints += pointsPied;
totalTriesPoints += pointsEssais;
});
const kickingPercentage = totalPoints > 0 ? Math.round((totalKickingPoints / totalPoints) * 100) : 0;
const triesPercentage = totalPoints > 0 ? Math.round((totalTriesPoints / totalPoints) * 100) : 0;
let gameStyle = »;
if (kickingPercentage > 60) {
gameStyle = ‘Jeu de position 🎯’;
} else if (triesPercentage > 60) {
gameStyle = ‘Jeu créatif ⚡’;
} else {
gameStyle = ‘Jeu équilibré ⚖️’;
}
return { totalKickingPoints, kickingPercentage, triesPercentage, gameStyle };
}
function calculateTacticalMetrics(stats) {
// Indice Offensif Dangereux (IOD) – basé sur les essais et l’efficacité
const triesPerMatch = parseFloat(stats.moyenne_essais_par_match || 0);
const pointsPerMatch = parseFloat(stats.moyenne_points_par_match || 0);
const efficiency = stats.nombre_essais > 0 ? pointsPerMatch / triesPerMatch : 0;
// IOD = (Essais/match × 10) + (Efficacité × 5)
const offensiveIndex = Math.round((triesPerMatch * 10) + (efficiency * 0.5));
// Solidité Défensive – basée sur l’avantage domicile et la discipline
const homeAdvantage = parseFloat(stats.pourcentage_victoires_domicile || 0) – parseFloat(stats.pourcentage_victoires_exterieur || 0);
const disciplineLevel = stats.moyenne_cartons_par_match > 2 ? ‘Indisciplinée’ : stats.moyenne_cartons_par_match 80 && defensiveRating > 80) {
tacticalProfile = ‘Équipe complète 👑’;
} else if (offensiveIndex > 70) {
tacticalProfile = ‘Attaque spectaculaire ⚡’;
} else if (defensiveRating > 80) {
tacticalProfile = ‘Muraille défensive 🛡️’;
} else if (homeAdvantage > 30) {
tacticalProfile = ‘Forteresse à domicile 🏟️’;
} else {
tacticalProfile = ‘En construction 🔧’;
}
return {
offensiveIndex,
triesPerMatch: triesPerMatch.toFixed(1),
defensiveRating,
tacticalProfile,
homeAdvantage: Math.round(homeAdvantage),
disciplineLevel
};
}
function getPerformanceLevel(value, type) {
switch(type) {
case ‘tries’:
if (value >= 8) return ‘excellent’;
if (value >= 5) return ‘good’;
return ‘average’;
case ‘defense’:
if (value >= 80) return ‘excellent’;
if (value >= 60) return ‘good’;
return ‘average’;
default:
return ‘average’;
}
}
function getPerformanceText(value, type) {
switch(type) {
case ‘tries’:
if (value >= 8) return ‘Excellent’;
if (value >= 5) return ‘Bon’;
return ‘Moyen’;
case ‘defense’:
if (value >= 80) return ‘Solide’;
if (value >= 60) return ‘Correct’;
return ‘Fragile’;
default:
return ‘N/A’;
}
}
function renderKickingSpecialists(playersData) {
if (!playersData || !Array.isArray(playersData)) return ‘
‘;
// Calculer les spécialistes du jeu au pied
const specialists = playersData.map(([nom, stats]) => {
const totalPoints = stats.points || 0;
const essais = stats.essais || 0;
const pointsEssais = essais * 5;
const pointsPied = totalPoints – pointsEssais;
const poucentPied = totalPoints > 0 ? (pointsPied / totalPoints) * 100 : 0;
return {
nom,
stats: { …stats, pointsPied, poucentPied },
sortValue: pointsPied
};
}).filter(player => player.sortValue > 0) // Seulement ceux avec des points au pied
.sort((a, b) => b.sortValue – a.sortValue)
.slice(0, 15);
return specialists.map((player, index) => {
const { nom, stats } = player;
const specialtyIcon = stats.poucentPied >= 90 ? ‘🎯’ : stats.poucentPied >= 70 ? ‘🥅’ : ‘⚽’;
return `
${index + 1}
${stats.team_img_url ? `
` : (stats.team_name || ‘E’).charAt(0)}
${specialtyIcon} ${nom}
${stats.team_name || ‘Équipe inconnue’}
${stats.pointsPied} pts pied
${Math.round(stats.poucentPied)}% de ses points
`;
}).join( »);
}
function renderDisciplineRanking(stats) {
if (!stats.meilleure_attaque || !Array.isArray(stats.meilleure_attaque)) return ‘
‘;
// Calculer le ratio cartons/match pour chaque équipe
const totalMatches = stats.nombre_de_matchs_joues || 1;
const disciplineData = stats.meilleure_attaque.map(team => {
const yellowCards = stats.classement_cartons_jaunes?.find(t => t.nom === team.nom)?.cartons_jaunes || 0;
const ratio = (yellowCards / Math.max(totalMatches / stats.meilleure_attaque.length, 1)).toFixed(2);
return {
…team,
cartons_jaunes: yellowCards,
ratio_cartons: parseFloat(ratio)
};
});
// Trier par meilleure discipline (moins de cartons = meilleur)
disciplineData.sort((a, b) => a.ratio_cartons – b.ratio_cartons);
return disciplineData.slice(0, 10).map((team, index) => {
return `
${team.image ? `
` : team.nom.charAt(0)}
${team.nom}
${team.cartons_jaunes} jaunes
${team.ratio_cartons}/match
`;
}).join( »);
}
function displayLiveScores(liveScores) {
const liveSection = document.getElementById(‘liveScoresSection’);
if (!liveScores || liveScores.length === 0) {
liveSection.innerHTML = »;
return;
}
const statusMap = {
‘endirect’: { class: ‘status-live’, text: ‘EN DIRECT’ },
‘mi-temps’: { class: ‘status-halftime’, text: ‘MI-TEMPS’ },
‘termine’: { class: ‘status-finished’, text: ‘TERMINÉ’ },
‘programme’: { class: ‘status-scheduled’, text: ‘À VENIR’ }
};
const liveMatches = liveScores.map(match => {
const status = statusMap[match.etat] || { class: ‘status-scheduled’, text: match.etat.toUpperCase() };
const score = match.score_locale !== null && match.score_visiteuse !== null
? `${match.score_locale} – ${match.score_visiteuse}`
: ‘–:–‘;
return `
${match.local_team.img_url ?
`
` :
match.local_team.name.charAt(0)
}
${match.local_team.name}
VS
${match.visitor_team.img_url ?
`
` :
match.visitor_team.name.charAt(0)
}
${match.visitor_team.name}
${score}
${status.text}
`;
}).join( »);
liveSection.innerHTML = `
${liveMatches}
`;
}
function toggleExpand(button, type) {
const content = button.closest(‘.ranking-container’).querySelector(‘.ranking-content’);
const isExpanded = content.classList.contains(‘expanded’);
if (isExpanded) {
content.classList.remove(‘expanded’);
button.textContent = type === ‘tries’ || type === ‘points’ ? ‘Voir le top 20’ : ‘Voir plus’;
button.classList.remove(‘expanded’);
} else {
content.classList.add(‘expanded’);
button.textContent = ‘Voir moins’;
button.classList.add(‘expanded’);
}
}
// Fonction pour charger seulement les scores live
async function loadLiveScoresOnly() {
try {
const liveResponse = await fetch(`${API_BASE_URL}/competitions/${COMPETITION_NAME}/live_scores`);
if (liveResponse.ok) {
const liveData = await liveResponse.json();
displayLiveScores(liveData.live_scores || []);
}
} catch (error) {
console.error(‘Erreur lors du chargement des scores live:’, error);
}
}
// Charger les statistiques au chargement de la page
document.addEventListener(‘DOMContentLoaded’, loadStats);
// Actualiser les statistiques complètes toutes les 5 minutes
setInterval(loadStats, 5 * 60 * 1000);
// Actualiser seulement les scores live toutes les 30 secondes
setInterval(loadLiveScoresOnly, 30 * 1000);
Statistiques Japan Rugby League One
Le Japan Rugby League One, sommet du rugby hexagonal, est un championnat où chaque match compte. Pour mieux comprendre la dynamique des clubs, l’analyse des statistiques Japan Rugby League One s’impose. Elles permettent d’évaluer les performances individuelles et collectives, tout en mettant en lumière les tendances de la saison.
Matchs joués : point de départ des Statistiques Japan Rugby League One
Le nombre de rencontres disputées constitue la base de toute analyse des Statistiques Japan Rugby League One. Chaque équipe suit un calendrier exigeant, avec un enchaînement de matchs à domicile et à l’extérieur. Ces données permettent de comparer les résultats à un moment précis de la saison.
Victoires, défaites et égalités : le rythme du classement
Le bilan d’une équipe se mesure d’abord par ses victoires. Le pourcentage de succès, qu’il soit obtenu à domicile ou en déplacement, reste un indicateur direct de la régularité. À l’inverse, le taux de défaites met en évidence les points faibles d’un groupe. Lorsqu’un match se termine sur un score égal, cela souligne souvent la solidité défensive ou la tension tactique. Toutes ces tendances apparaissent clairement dans les statistiques Japan Rugby League One .
Points inscrits : le marqueur de la puissance offensive des Statistiques Japan Rugby League One
Le nombre total de points marqués reflète la capacité d’une équipe à construire son jeu. Plus une formation inscrit de points, plus son efficacité offensive se confirme. La moyenne de points par match permet d’observer la constance d’une ligne d’attaque. En suivant cette statistique tout au long de la saison, on identifie rapidement les clubs les plus dangereux ballon en main.
Essais marqués : symbole du rugby spectacle
Chaque essai témoigne d’une construction collective réussie. Le volume d’essais inscrits dans le Japan Rugby League One souligne les qualités techniques et physiques des équipes. Observer la fréquence des essais par match aide à comparer les stratégies offensives. Ces données complètent les statistiques Japan Rugby League One avec des indicateurs de performance spectaculaires.
Discipline : un facteur souvent décisif
Les cartons influencent directement l’issue d’une rencontre. Une équipe sanctionnée s’expose à une infériorité numérique préjudiciable. En analysant le nombre de cartons jaunes ou rouges, on mesure le niveau de maîtrise des joueurs. Une formation disciplinée conserve sa structure plus longtemps et augmente ses chances de succès.
Forces collectives et joueurs décisifs
Les statistiques Japan Rugby League One mettent aussi en lumière les meilleures attaques et défenses du championnat. Elles révèlent quelles équipes dominent dans la circulation du ballon ou dans la capacité à stopper l’adversaire. En parallèle, le suivi des meilleurs réalisateurs et marqueurs identifie les éléments-clés du jeu. Ces indicateurs guident les observateurs et nourrissent les débats.
Pour résumer
Les statistiques Japan Rugby League One dévoilent les dessous du jeu et enrichissent l’analyse. Elles permettent de suivre les performances, d’anticiper les dynamiques et d’identifier les leaders de la saison. Grâce à ces données, le rugby devient plus lisible, sans rien perdre de sa passion.
Statistiques TOP 14