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:
Rolf
2026-03-20 10:16:46 +01:00
parent 4b31b98f89
commit 3a1da1482c
51 changed files with 4964 additions and 1 deletions
+28
View File
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="theme-color" content="#2d6a4f">
<link rel="manifest" href="/static/manifest.json">
<link rel="stylesheet" href="/static/style.css">
<title>Check your email Skins &amp; Pins</title>
</head>
<body>
<div class="login-container">
<div class="login-logo">📬</div>
<h1 class="login-title">Check your email</h1>
<p class="login-subtitle">We sent a login link to <strong>{{ email }}</strong></p>
<div class="login-card card">
<p style="color: var(--text-muted); font-size: 0.9rem; text-align: center;">
The link expires in 15 minutes.<br>You can close this tab.
</p>
</div>
<a href="/login" style="color: var(--text-muted); font-size: 0.85rem; margin-top: 1.5rem;">
← Use a different email
</a>
</div>
</body>
</html>
+33
View File
@@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="theme-color" content="#2d6a4f">
<link rel="manifest" href="/static/manifest.json">
<link rel="stylesheet" href="/static/style.css">
<title>Login Skins &amp; Pins</title>
</head>
<body>
<div class="login-container">
<div class="login-logo"></div>
<h1 class="login-title">Skins &amp; Pins</h1>
<p class="login-subtitle">Enter your email to get a login link</p>
<div class="login-card card">
{% if error %}
<div class="alert alert-error">{{ error }}</div>
{% endif %}
<form method="post" action="/login">
<div class="form-group">
<label for="email">Email address</label>
<input type="email" id="email" name="email" placeholder="you@example.com"
autocomplete="email" autocapitalize="none" required>
</div>
<button type="submit" class="btn btn-primary">Send login link</button>
</form>
</div>
</div>
</body>
</html>