Files
gniza4linux/web/templates/login.html
shuki 133ae1e7a4 Restore Flask dashboard with redesigned UI and API key auth
- Revert from textual-serve back to Flask (textual-serve had WebSocket issues)
- Completely redesigned dashboard: modern dark theme, stat cards, clean tables
- Redesigned login page to match
- Restored API key generation in install script
- Keep API key field in TUI settings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 06:09:39 +02:00

155 lines
3.3 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GNIZA - Login</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
:root {
--bg-primary: #0f1117;
--bg-card: #1a1d27;
--bg-input: #13151d;
--border: #2a2d3a;
--text-primary: #e4e4e7;
--text-secondary: #9ca3af;
--text-muted: #6b7280;
--accent: #10b981;
--danger: #ef4444;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--bg-primary);
color: var(--text-primary);
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
}
.login-card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 12px;
padding: 2.5rem;
width: 100%;
max-width: 380px;
}
.login-brand {
display: flex;
align-items: center;
justify-content: center;
gap: 0.75rem;
margin-bottom: 2rem;
}
.login-logo {
width: 40px;
height: 40px;
background: var(--accent);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1.3rem;
color: var(--bg-primary);
}
.login-title {
font-size: 1.4rem;
font-weight: 700;
letter-spacing: 0.03em;
}
.flash {
background: rgba(239, 68, 68, 0.1);
border: 1px solid rgba(239, 68, 68, 0.2);
color: var(--danger);
padding: 0.6rem 0.8rem;
border-radius: 8px;
margin-bottom: 1.25rem;
text-align: center;
font-size: 0.85rem;
}
label {
display: block;
margin-bottom: 0.4rem;
color: var(--text-secondary);
font-size: 0.85rem;
font-weight: 500;
}
input[type="password"] {
width: 100%;
padding: 0.7rem 0.9rem;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: 8px;
color: var(--text-primary);
font-family: 'JetBrains Mono', monospace;
font-size: 0.9rem;
margin-bottom: 1.25rem;
transition: border-color 0.15s;
}
input[type="password"]:focus {
outline: none;
border-color: var(--accent);
}
button {
width: 100%;
padding: 0.7rem;
background: var(--accent);
color: var(--bg-primary);
border: none;
border-radius: 8px;
font-family: inherit;
font-size: 0.9rem;
font-weight: 600;
cursor: pointer;
transition: filter 0.15s;
}
button:hover {
filter: brightness(1.1);
}
.login-footer {
text-align: center;
margin-top: 1.5rem;
color: var(--text-muted);
font-size: 0.78rem;
}
</style>
</head>
<body>
<div class="login-card">
<div class="login-brand">
<div class="login-logo">G</div>
<div class="login-title">GNIZA</div>
</div>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for msg in messages %}
<div class="flash">{{ msg }}</div>
{% endfor %}
{% endif %}
{% endwith %}
<form method="POST">
<label for="token">API Key</label>
<input type="password" name="token" id="token" placeholder="Enter your API key" autofocus>
<button type="submit">Sign In</button>
</form>
<div class="login-footer">GNIZA Backup Manager</div>
</div>
</body>
</html>