Login.tsx
Raw
1import { Layout } from "../layout.tsx";
2
3interface LoginProps {
4 error?: string;
5}
6
7export function Login({ error }: LoginProps) {
8 return (
9 <Layout user={null} title="Sign in">
10 <div class="auth-container">
11 <h1 class="page-title">Sign in</h1>
12 {error && <p class="form-error">{error}</p>}
13 <form method="POST" action="/login" class="auth-form">
14 <div class="form-group">
15 <label for="username">Username</label>
16 <input
17 id="username"
18 name="username"
19 type="text"
20 required
21 autocomplete="username"
22 />
23 </div>
24 <div id="passkey-section" style="display:none">
25 <button
26 id="passkey-btn"
27 class="btn btn-secondary btn-block"
28 type="button"
29 >
30 Sign in with passkey
31 </button>
32 <p id="passkey-error" style="display:none"></p>
33 <div class="auth-divider">
34 <span>or</span>
35 </div>
36 </div>
37 <div class="form-group">
38 <label for="password">Password</label>
39 <input
40 id="password"
41 name="password"
42 type="password"
43 required
44 autocomplete="current-password"
45 />
46 </div>
47 <button type="submit" class="btn btn-primary btn-block">
48 Sign in with password
49 </button>
50 </form>
51 <p class="auth-footer">
52 Don't have an account? <a href="/register">Register</a>
53 </p>
54 </div>
55 <script type="module" src="/assets/passkey-login.js"></script>
56 </Layout>
57 );
58}
59