Szabo Ivan c168da359e implement complete frontend:
- add lobby, game, leaderboard, results pages
- add scripts: storage, lobby, game, drawing, scoring, countries
- add styles: main, lobby, game
- unify header/footer across all pages
- show lobby name in lobby view
- remove clear board from leaderboard
2026-05-05 13:01:14 +02:00

155 lines
4.8 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>GeoDraw — Leaderboard</title>
<link rel="stylesheet" href="./styles/main.css" />
<link rel="stylesheet" href="./styles/leader.css" />
</head>
<body>
<div class="wrap">
<header class="header">
<div class="container header__inner">
<a href="index.html" class="logo">
<div class="logo__mark">
<svg viewBox="0 0 24 24" fill="none">
<circle cx="12" cy="12" r="9" stroke="white" stroke-width="1.6"/>
<path d="M3 12 Q8 8 12 12 Q16 16 21 12" stroke="white" stroke-width="1.4" fill="none"/>
<path d="M12 3 Q14 8 12 12 Q10 16 12 21" stroke="white" stroke-width="1.4" fill="none"/>
</svg>
</div>
<span class="logo__text">GeoDraw</span>
</a>
<nav class="nav">
<a href="index.html" class="nav__link">Home</a>
<a href="lobby.html" class="nav__cta">Play again →</a>
</nav>
</div>
</header>
<main>
<div class="container lb-page">
<div class="lb-inner">
<div class="lb-head">
<div>
<p class="section-label">Top players</p>
<h1 class="lb-title">Leader<em>board</em></h1>
</div>
<div class="lb-actions">
<a href="lobby.html" class="btn btn--primary btn--sm">Play again →</a>
</div>
</div>
<div class="lb-table" id="lb-table">
<div class="lb-table-head">
<span class="lb-th">#</span>
<span class="lb-th">Player</span>
<span class="lb-th hide-sm right">Rounds</span>
<span class="lb-th hide-sm right">Date</span>
<span class="lb-th right">Score</span>
</div>
<div class="lb-body" id="lb-body">
<!-- filled by JS -->
</div>
</div>
<div id="your-bar" class="your-score-bar" style="display:none">
<p class="your-score-bar__text">Your latest: <strong id="your-bar-name"></strong></p>
<p class="your-score-bar__text">Score: <strong id="your-bar-score" style="color:var(--sea)"></strong> / 300</p>
</div>
</div>
</div>
</main>
<footer class="footer">
<div class="container footer__inner">
<div class="footer__left">
</div>
<div class="footer__center">
<a href="index.html" class="footer__brand">GeoDraw</a>
<p class="footer__sub">Browser geography game</p>
</div>
<div class="footer__right">
</div>
</div>
</footer>
</div>
<script src="scripts/storage.js"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const currentPlayer = Storage.getPlayerName();
const body = document.getElementById("lb-body");
function render() {
const board = Storage.getLeaderboard();
body.innerHTML = "";
if (!board.length) {
body.innerHTML = `
<div class="lb-empty">
<div class="lb-empty__icon">🏁</div>
<p class="lb-empty__text">No games played yet. Be the first on the board!</p>
<a href="lobby.html" class="btn btn--primary btn--sm">Play now →</a>
</div>`;
return;
}
const medals = ["🥇","🥈","🥉"];
const scoreClasses = ["gold","silver","bronze"];
board.forEach((entry, i) => {
const rank = i + 1;
const isYou = entry.name === currentPlayer;
const date = entry.date
? new Date(entry.date).toLocaleDateString("en-CH", { day:"2-digit", month:"short" })
: "—";
const rounds = (entry.scores || []).join(" · ") || "—";
const row = document.createElement("div");
row.className = `lb-row${rank <= 3 ? ` rank-${rank}` : ""}`;
row.style.animationDelay = `${i * 0.05}s`;
row.innerHTML = `
<span class="lb-rank">${rank <= 3 ? `<span class="lb-medal">${medals[rank-1]}</span>` : rank}</span>
<span class="lb-name${isYou ? " is-you" : ""}">${escHtml(entry.name)}</span>
<span class="lb-rounds hide-sm">${escHtml(rounds)}</span>
<span class="lb-date hide-sm">${date}</span>
<span class="lb-score${rank <= 3 ? " " + scoreClasses[rank-1] : ""}">${entry.totalScore}</span>
`;
body.appendChild(row);
});
// Your latest score bar
const latest = board.find(e => e.name === currentPlayer);
if (latest) {
document.getElementById("your-bar").style.display = "flex";
document.getElementById("your-bar-name").textContent = latest.name;
document.getElementById("your-bar-score").textContent = latest.totalScore;
}
}
function escHtml(str) {
return String(str)
.replace(/&/g,"&amp;")
.replace(/</g,"&lt;")
.replace(/>/g,"&gt;");
}
render();
});
</script>
</body>
</html>