Add full SkinsPins application
- FastAPI + SQLite + Alpine.js + HTMX PWA for Bingo Bango Bongo golf scoring - Passwordless magic link auth with email (aiosmtplib) and admin invite system - Real-time score entry via WebSocket with drag-and-drop player ordering - Course management with per-hole par and stroke index - Scorecard with golf score markers (birdie, eagle, bogey, etc.) - Two-step new game form with tee selection per player - Dashboard with stats, live games social stream, and recent game history - Game summary view (read-only scorecard with leaderboard) - User profile pages with win stats - PWA install support with generated PNG icons - Admin panel for users, courses, games, and invitations Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
{% set path = request.url.path %}
|
||||
<nav class="bottom-nav">
|
||||
<a href="/" class="nav-item {% if path == '/' %}active{% endif %}">
|
||||
<span class="nav-icon">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M3 9.5L12 3l9 6.5V20a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V9.5z"/>
|
||||
<path d="M9 21V12h6v9"/>
|
||||
</svg>
|
||||
</span>
|
||||
<span>Home</span>
|
||||
</a>
|
||||
<a href="/games" class="nav-item {% if path.startswith('/games') %}active{% endif %}">
|
||||
<span class="nav-icon">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<line x1="12" y1="3" x2="12" y2="21"/>
|
||||
<path d="M12 3l7 5-7 5"/>
|
||||
<ellipse cx="12" cy="20" rx="4" ry="1.5"/>
|
||||
</svg>
|
||||
</span>
|
||||
<span>Games</span>
|
||||
</a>
|
||||
{% if user.email == admin_email %}
|
||||
<a href="/admin" class="nav-item {% if path.startswith('/admin') %}active{% endif %}">
|
||||
<span class="nav-icon">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="3"/>
|
||||
<path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/>
|
||||
</svg>
|
||||
</span>
|
||||
<span>Admin</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
<a href="/profile" class="nav-item {% if path == '/profile' %}active{% endif %}">
|
||||
<span class="nav-icon nav-avatar">
|
||||
{% if user.avatar and user.avatar.startswith('/') %}
|
||||
<img src="{{ user.avatar }}" alt="avatar" class="nav-avatar-img">
|
||||
{% elif user.avatar %}
|
||||
{{ user.avatar }}
|
||||
{% else %}
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<circle cx="12" cy="8" r="4"/>
|
||||
<path d="M4 20c0-4 3.6-7 8-7s8 3 8 7"/>
|
||||
</svg>
|
||||
{% endif %}
|
||||
</span>
|
||||
<span>Profile</span>
|
||||
</a>
|
||||
</nav>
|
||||
Reference in New Issue
Block a user