Files
boker/templates/base.html
T
2026-06-22 20:51:19 -07:00

96 lines
4.1 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}myboker.org{% endblock %}</title>
<link rel="icon" href="{{ url_for('static', filename='favicon.svg') }}" type="image/svg+xml">
<link rel="stylesheet" href="{{ url_for('static', filename='css/tokens.css') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<header class="topbar">
<div class="topbar__inner">
<a class="brand" href="{{ url_for('public.leaderboard') }}">
<span class="brand__mark"></span>
<span class="brand__name">myboker.org</span>
</a>
<button class="nav-toggle" type="button" aria-controls="mainnav" aria-expanded="false" aria-label="Open navigation">
<span></span>
<span></span>
<span></span>
</button>
<nav class="mainnav" id="mainnav">
<a class="navlink {{ 'is-active' if request.endpoint == 'public.leaderboard' }}" href="{{ url_for('public.leaderboard') }}">Leaderboard</a>
<a class="navlink {{ 'is-active' if request.endpoint in ('public.sessions', 'public.session_detail') }}" href="{{ url_for('public.sessions') }}">Sessions</a>
{% if is_admin %}
<a class="navlink {{ 'is-active' if request.endpoint == 'admin.dashboard' }}" href="{{ url_for('admin.dashboard') }}">Admin</a>
{% else %}
<a class="navlink {{ 'is-active' if request.endpoint == 'admin.login' }}" href="{{ url_for('admin.login') }}">Admin</a>
{% endif %}
</nav>
<span class="topbar__spacer"></span>
{% if is_admin %}
<div class="topbar__admin-actions">
<form method="post" action="{{ url_for('admin.logout') }}" style="margin:0">
<button class="btn btn--ghost btn--sm" type="submit">Logout</button>
</form>
</div>
{% endif %}
</div>
</header>
<main class="page {% block page_class %}page--public{% endblock %}">
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<div class="flash-stack">
{% for category, message in messages %}
<div class="flash {{ category }}">{{ message }}</div>
{% endfor %}
</div>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
<footer class="site-footer" aria-label="Site footer">
<span>&copy; 2026 myboker.org</span>
<span>Version {{ app_version }}</span>
<span>cedarline.digital</span>
</footer>
</main>
<script>
(() => {
const toggle = document.querySelector('.nav-toggle');
const nav = document.getElementById('mainnav');
if (!toggle || !nav) return;
const setOpen = (open) => {
document.body.classList.toggle('nav-is-open', open);
toggle.setAttribute('aria-expanded', String(open));
toggle.setAttribute('aria-label', open ? 'Close navigation' : 'Open navigation');
};
toggle.addEventListener('click', () => {
setOpen(!document.body.classList.contains('nav-is-open'));
});
nav.addEventListener('click', (event) => {
if (event.target.closest('a')) setOpen(false);
});
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape') setOpen(false);
});
document.addEventListener('click', (event) => {
if (!document.body.classList.contains('nav-is-open')) return;
if (event.target.closest('.topbar')) return;
setOpen(false);
});
window.addEventListener('resize', () => {
if (window.matchMedia('(min-width: 701px)').matches) setOpen(false);
});
})();
</script>
</body>
</html>