Skip to main content

max / makenotwork

2.9 KB · 93 lines History Blame Raw
1 {% extends "base.html" %}
2
3 {% block title %}Log In - Makenotwork{% endblock %}
4
5 {% block body_attrs %} class="centered-page"{% endblock %}
6
7 {% block content %}
8 <h1 class="brand-h1">Makenot<span class="dot">.</span>work</h1>
9 <div class="login-container">
10 <div id="login-errors">
11 {% if let Some(msg) = error %}<div class="alert alert-error">{{ msg }}</div>{% endif %}
12 </div>
13
14 <form class="login-form"
15 method="post"
16 action="/login"
17 hx-post="/login"
18 hx-target="#login-errors"
19 hx-swap="innerHTML"
20 hx-indicator="#login-spinner">
21 {% if let Some(token) = csrf_token %}<input type="hidden" name="_csrf" value="{{ token }}">{% endif %}
22 <h2 class="subtitle-h2">Log in</h2>
23 <div class="form-group">
24 <label for="login">Username or Email</label>
25 <input
26 type="text"
27 id="login"
28 name="login"
29 placeholder="username or you@example.com"
30 value="{{ prefill_login }}"
31 required
32 autofocus
33 />
34 </div>
35
36 <div class="form-group">
37 <label for="password">Password</label>
38 <input
39 type="password"
40 id="password"
41 name="password"
42 placeholder="--------"
43 required
44 />
45 </div>
46
47 <div class="checkbox-group">
48 <input type="checkbox" id="remember-me" name="remember_me" />
49 <label for="remember-me">Remember me</label>
50 </div>
51
52 <button type="submit" class="btn-primary">
53 Log In
54 <span id="login-spinner" class="htmx-indicator"> ...</span>
55 </button>
56
57 <div class="foot-link">
58 <a href="/forgot-password">Reset Password<span class="dot">.</span></a>
59 </div>
60
61 <div class="foot-link">
62 <a href="/join">Join now<span class="dot">.</span></a>
63 </div>
64 </form>
65
66 <div id="passkey-login" class="hidden">
67 <div class="login-divider">or</div>
68 <button class="btn-secondary login-passkey-btn" onclick="loginWithPasskey()">
69 Sign in with Passkey (fingerprint, face, or security key)
70 </button>
71 <div id="passkey-login-error" class="login-passkey-error"></div>
72 </div>
73 </div>
74 {% endblock %}
75
76 {% block scripts %}
77 <script>
78 // Handle successful login redirect via HX-Redirect header
79 document.body.addEventListener('htmx:beforeSwap', function(evt) {
80 if (evt.detail.xhr.status === 200 && evt.detail.xhr.getResponseHeader('HX-Redirect')) {
81 // Let HTMX handle the redirect
82 }
83 });
84 </script>
85 <script src="/static/passkey.js"></script>
86 <script>
87 // Show passkey button if browser supports WebAuthn
88 if (window.PublicKeyCredential) {
89 document.getElementById('passkey-login').classList.remove('hidden');
90 }
91 </script>
92 {% endblock %}
93