Files
Site_web/exercices/memory-pictogrammes/assets/css/leaderboard.css
gauthier.chombart cf69373417 Corrige la superposition header/contenu et harmonise le style du jeu Memory
L'animation d'entrée (translation + rebond infini du badge) pouvait
faire chevaucher le header. Remplacée par une simple apparition sans
déplacement vertical, avec plus de marge sous le header.

Aligne aussi les rayons d'angle, les ombres et les boutons du jeu sur
le langage visuel déjà utilisé ailleurs sur le site (cartes à 12px de
rayon, ombres neutres, titre de section souligné, style de bouton
partagé depuis header-style.css).
2026-07-07 17:06:09 +02:00

448 lines
8.3 KiB
CSS

/* ============================================
LEADERBOARD & PLAYER STATS
============================================ */
.leaderboard-section {
margin-top: 80px;
animation: fadeInUp 0.6s ease-out 0.6s both;
text-align: center;
}
.leaderboard-section h2 {
font-family: 'Syne', sans-serif;
font-size: clamp(24px, 5vw, 32px);
font-weight: 800;
letter-spacing: -0.5px;
color: var(--text);
margin: 0 auto 32px;
padding-bottom: 12px;
border-bottom: 3px solid var(--teal-mid);
display: inline-block;
}
/* ============================================
TABS (Filtre par difficulté)
============================================ */
.tabs {
display: flex;
gap: 8px;
justify-content: center;
margin-bottom: 32px;
flex-wrap: wrap;
}
.tab-btn {
padding: 10px 20px;
background: var(--white);
border: 2px solid var(--teal-light);
border-radius: 8px;
font-family: 'Syne', sans-serif;
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
cursor: pointer;
transition: all 0.3s ease;
color: var(--text-muted);
}
.tab-btn:hover {
border-color: var(--teal-mid);
color: var(--teal-mid);
}
.tab-btn.active {
background: linear-gradient(135deg, var(--teal-mid), var(--teal-dark));
border-color: var(--teal-dark);
color: var(--white);
box-shadow: var(--shadow-md);
}
/* ============================================
LEADERBOARD LIST
============================================ */
.leaderboard {
background: linear-gradient(135deg, var(--teal-light), var(--white));
border-radius: 12px;
padding: 24px;
border: 2px solid var(--teal-mid);
margin-bottom: 48px;
box-shadow: var(--shadow-sm);
text-align: left;
}
.leaderboard-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.rank-item {
display: grid;
grid-template-columns: 50px 1fr auto auto;
align-items: center;
gap: 16px;
background: var(--white);
padding: 16px;
border-radius: 8px;
transition: all 0.3s ease;
border-left: 4px solid var(--teal-light);
position: relative;
overflow: hidden;
}
.rank-item::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(29, 158, 117, 0.1), transparent);
transition: left 0.5s ease;
}
.rank-item:hover {
transform: translateX(8px);
box-shadow: 0 4px 12px rgba(15, 110, 86, 0.15);
border-left-color: var(--teal-mid);
}
.rank-item:hover::before {
left: 100%;
}
/* Rang numéro ou médaille */
.rank-number {
font-weight: 800;
font-size: 18px;
color: var(--teal-mid);
text-align: center;
font-family: 'Syne', sans-serif;
}
.rank-number.medal-1 {
font-size: 24px;
}
.rank-number.medal-1::before {
content: '🥇';
display: block;
}
.rank-number.medal-2::before {
content: '🥈';
display: block;
font-size: 20px;
}
.rank-number.medal-3::before {
content: '🥉';
display: block;
font-size: 20px;
}
/* Infos joueur */
.rank-info {
flex: 1;
}
.player-name {
font-weight: 600;
color: var(--text);
margin-bottom: 4px;
font-size: 14px;
}
.player-stats {
font-size: 12px;
color: var(--text-muted);
display: flex;
gap: 12px;
flex-wrap: wrap;
}
.player-stats span {
display: inline-flex;
align-items: center;
gap: 4px;
}
/* Score et difficulté */
.rank-score {
font-weight: 700;
color: var(--teal-dark);
font-size: 18px;
font-family: 'Syne', sans-serif;
min-width: 60px;
text-align: right;
}
.rank-difficulty {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 4px 8px;
border-radius: 4px;
background: var(--teal-light);
color: var(--teal-dark);
min-width: 60px;
text-align: center;
}
.rank-difficulty.easy {
background: #C8E6C9;
color: #2E7D32;
}
.rank-difficulty.normal {
background: var(--teal-light);
color: var(--teal-dark);
}
.rank-difficulty.hard {
background: #FFCCBC;
color: #D84315;
}
/* Message si pas de scores */
.empty-state {
text-align: center;
padding: 40px 20px;
color: var(--text-muted);
}
.empty-state-icon {
font-size: 48px;
margin-bottom: 16px;
}
.empty-state-text {
font-size: 14px;
margin-bottom: 8px;
}
.empty-state-hint {
font-size: 12px;
opacity: 0.7;
}
/* ============================================
PLAYER STATS SECTION
============================================ */
.player-stats {
background: linear-gradient(135deg, rgba(15, 110, 86, 0.05), transparent);
border-radius: 16px;
padding: 32px;
border: 2px solid var(--teal-light);
}
.player-stats h3 {
font-family: 'Syne', sans-serif;
font-size: 24px;
font-weight: 700;
color: var(--teal);
margin-bottom: 24px;
text-align: center;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 16px;
}
.stat-card {
background: var(--white);
border: 2px solid var(--teal-light);
border-radius: 12px;
padding: 20px;
text-align: center;
transition: all 0.3s ease;
display: flex;
flex-direction: column;
align-items: center;
}
.stat-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-md);
border-color: var(--teal-mid);
}
.stat-icon {
font-size: 32px;
margin-bottom: 12px;
}
.stat-label {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--text-muted);
margin-bottom: 8px;
}
.stat-value {
font-size: 28px;
font-weight: 800;
background: linear-gradient(135deg, var(--teal-mid), var(--teal-dark));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
font-family: 'Syne', sans-serif;
}
.stat-card.high-value .stat-value {
font-size: 32px;
animation: popIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* ============================================
NO DATA STATE
============================================ */
.no-stats {
text-align: center;
padding: 40px;
color: var(--text-muted);
}
.no-stats-icon {
font-size: 48px;
margin-bottom: 16px;
}
.no-stats-title {
font-size: 16px;
font-weight: 600;
margin-bottom: 8px;
}
.no-stats-desc {
font-size: 13px;
opacity: 0.8;
}
/* ============================================
RESPONSIVE DESIGN
============================================ */
@media (max-width: 768px) {
.leaderboard-section h2 {
font-size: 24px;
}
.tabs {
gap: 6px;
}
.tab-btn {
padding: 8px 16px;
font-size: 11px;
}
.rank-item {
grid-template-columns: 40px 1fr auto;
gap: 12px;
}
.rank-difficulty {
display: none;
}
.rank-number {
font-size: 16px;
}
.rank-score {
font-size: 16px;
}
.player-stats {
padding: 24px;
}
.player-stats h3 {
font-size: 20px;
}
.stats-grid {
grid-template-columns: repeat(2, 1fr);
gap: 12px;
}
.stat-card {
padding: 16px;
}
.stat-icon {
font-size: 28px;
margin-bottom: 8px;
}
.stat-value {
font-size: 24px;
}
}
@media (max-width: 480px) {
.leaderboard {
padding: 16px;
border-radius: 12px;
}
.tabs {
gap: 4px;
}
.tab-btn {
padding: 6px 12px;
font-size: 10px;
}
.rank-item {
grid-template-columns: 40px 1fr;
gap: 10px;
padding: 12px;
}
.rank-score {
grid-column: 1 / -1;
text-align: left;
margin-top: 8px;
}
.rank-number {
font-size: 14px;
}
.player-name {
font-size: 13px;
}
.player-stats {
padding: 16px;
}
.player-stats h3 {
font-size: 18px;
}
.stats-grid {
grid-template-columns: 1fr;
}
.stat-card {
padding: 12px;
}
.stat-icon {
font-size: 24px;
}
.stat-value {
font-size: 20px;
}
}