Build the core user-facing experience with admin login (bcrypt + signed session cookies), profile switcher, workout day viewer with warmups and exercise cards, and HTMX-powered exercise browser with search/filter. - AuthService with bcrypt password verification and itsdangerous session tokens - Auth dependency redirects to /login (303) for unauthenticated requests - NavContextMiddleware injects admin/profiles/active_profile into all templates - Profile management (list, switch, edit) with cookie-based active profile - Workout day viewer shows warmups + exercises + per-user programming targets - Exercise browser with HTMX filter dropdowns (no page reloads) - Flash message partial for success/error feedback - 12 new tests (66 total passing) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
50 lines
1.4 KiB
HTML
50 lines
1.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" data-theme="dark">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>{% block title %}SneakySwole{% endblock %}</title>
|
|
|
|
<!-- Pico CSS (dark theme via data-theme="dark" on <html>) -->
|
|
<link rel="stylesheet"
|
|
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css">
|
|
|
|
<!-- Custom overrides -->
|
|
<link rel="stylesheet" href="/static/css/sneakyswole.css">
|
|
|
|
<!-- HTMX -->
|
|
<script src="https://unpkg.com/htmx.org@2.0.4"
|
|
integrity="sha384-HGfztofotfshcF7+8n44JQL2oJmowVChPTg48S+jvZoztPfvwD79OC/LTtG6dMp+"
|
|
crossorigin="anonymous"></script>
|
|
|
|
{% block head_extra %}{% endblock %}
|
|
</head>
|
|
<body>
|
|
<header class="container">
|
|
<nav>
|
|
<ul>
|
|
<li><strong><a href="/">SneakySwole</a></strong></li>
|
|
</ul>
|
|
<ul>
|
|
{% block nav_items %}
|
|
{% include "partials/nav.html" ignore missing %}
|
|
{% endblock %}
|
|
</ul>
|
|
</nav>
|
|
</header>
|
|
|
|
<main class="container">
|
|
{% block flash %}
|
|
{% include "partials/flash_message.html" ignore missing %}
|
|
{% endblock %}
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
|
|
<footer class="container">
|
|
<small>SneakySwole — Open-source workout tracking</small>
|
|
</footer>
|
|
|
|
{% block scripts %}{% endblock %}
|
|
</body>
|
|
</html>
|