- Renewal tracking: compute due/overdue status from the most recent mot/insurance event (renewal_months, renewal_due_soon_days settings), surfaced on the service card and dashboard. - Service-status card metrics now render as a two-column label/value table with row separators instead of wrapping auto-fill grid cells. - Add a bicycle favicon (favicon.svg) to base + login templates. Co-Authored-By: opencode <opencode@users.noreply.github.com>
34 lines
1.0 KiB
HTML
34 lines
1.0 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Log in - bike-admin</title>
|
|
<link rel="icon" href="/static/favicon.svg" type="image/svg+xml">
|
|
<link rel="stylesheet" href="/static/main.css">
|
|
</head>
|
|
<body class="auth">
|
|
<main class="container auth-card">
|
|
<h1 style="margin-top:0">bike-admin</h1>
|
|
<p class="muted">Log in to manage your bikes.</p>
|
|
|
|
{% if error %}
|
|
<div class="alert alert-error" role="alert">{{ error }}</div>
|
|
{% endif %}
|
|
|
|
<form method="post" action="/login" novalidate>
|
|
<label>
|
|
<span>Username</span>
|
|
<input type="text" name="username" autocomplete="username" required autofocus>
|
|
</label>
|
|
<label>
|
|
<span>Password</span>
|
|
<input type="password" name="password" autocomplete="current-password" required>
|
|
</label>
|
|
<input type="hidden" name="next" value="/">
|
|
<button type="submit" class="btn btn-primary btn-block">Log in</button>
|
|
</form>
|
|
</main>
|
|
</body>
|
|
</html>
|