ui: login landing and header version
This commit is contained in:
@ -97,6 +97,48 @@ body.dark-mode .theme-toggle .sun-icon {
|
|||||||
padding: 20px;
|
padding: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-landing {
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 24px;
|
||||||
|
background: radial-gradient(circle at 20% 10%, rgba(102, 126, 234, 0.15), transparent 45%),
|
||||||
|
radial-gradient(circle at 80% 20%, rgba(72, 187, 120, 0.12), transparent 40%),
|
||||||
|
var(--bg-main);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-card {
|
||||||
|
width: min(520px, 100%);
|
||||||
|
background: var(--bg-panel);
|
||||||
|
border: 1px solid var(--border-main);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 32px;
|
||||||
|
box-shadow: var(--shadow-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-brand {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 16px;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-brand i {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-brand h1 {
|
||||||
|
font-size: 1.6rem;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Header - Keep the gradient but more professional */
|
/* Header - Keep the gradient but more professional */
|
||||||
header {
|
header {
|
||||||
background: var(--bg-header);
|
background: var(--bg-header);
|
||||||
@ -105,6 +147,11 @@ header {
|
|||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
box-shadow: var(--shadow-md);
|
box-shadow: var(--shadow-md);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
header h1 {
|
header h1 {
|
||||||
@ -119,6 +166,34 @@ header p {
|
|||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header-main {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-main i {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-meta {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-end;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-version {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
padding: 6px 10px;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
/* Statistics Dashboard - More visual interest */
|
/* Statistics Dashboard - More visual interest */
|
||||||
.stats {
|
.stats {
|
||||||
display: grid;
|
display: grid;
|
||||||
@ -647,6 +722,14 @@ textarea:focus {
|
|||||||
.modal-content {
|
.modal-content {
|
||||||
padding: 24px 20px;
|
padding: 24px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.login-card {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-meta {
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NEW STYLES FOR ENHANCED UI */
|
/* NEW STYLES FOR ENHANCED UI */
|
||||||
|
|||||||
@ -18,40 +18,16 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div class="container">
|
<div id="loginLanding" class="login-landing">
|
||||||
|
<div class="login-card">
|
||||||
<!-- Header -->
|
<div class="login-brand">
|
||||||
<header>
|
|
||||||
<h1>
|
|
||||||
<i data-lucide="shield-check"></i>
|
<i data-lucide="shield-check"></i>
|
||||||
Safe Kiddo Control
|
<div>
|
||||||
</h1>
|
<h1>Safe Kiddo Control</h1>
|
||||||
<div class="user-info" id="headerStatus">
|
<p class="text-muted">Anmeldung erforderlich</p>
|
||||||
<span id="currentUser">Nicht angemeldet</span>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<!-- Metrics Dashboard -->
|
|
||||||
<div class="metrics">
|
|
||||||
<div class="metric-card" id="metricUsers">
|
|
||||||
<div class="label"><i data-lucide="users"></i> Verwaltbare Nutzer</div>
|
|
||||||
<div class="value">-</div>
|
|
||||||
</div>
|
|
||||||
<div class="metric-card" id="metricActive">
|
|
||||||
<div class="label"><i data-lucide="user-check"></i> Aktive Konten</div>
|
|
||||||
<div class="value">-</div>
|
|
||||||
</div>
|
|
||||||
<div class="metric-card warning" id="metricLocked">
|
|
||||||
<div class="label"><i data-lucide="lock"></i> Gesperrte Konten</div>
|
|
||||||
<div class="value">-</div>
|
|
||||||
</div>
|
|
||||||
<div class="metric-card" id="metricVersion">
|
|
||||||
<div class="label"><i data-lucide="package"></i> Version</div>
|
|
||||||
<div class="value text-muted" style="font-size: 1.25rem;">-</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Login Section -->
|
|
||||||
<section id="loginSection">
|
<section id="loginSection">
|
||||||
<h3><i data-lucide="log-in"></i> Anmeldung</h3>
|
<h3><i data-lucide="log-in"></i> Anmeldung</h3>
|
||||||
<p class="text-muted mb-1">Melde dich an um Nutzerkonten zu verwalten</p>
|
<p class="text-muted mb-1">Melde dich an um Nutzerkonten zu verwalten</p>
|
||||||
@ -82,6 +58,45 @@
|
|||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="appContainer" class="container hidden">
|
||||||
|
<!-- Header -->
|
||||||
|
<header>
|
||||||
|
<div class="header-main">
|
||||||
|
<h1>
|
||||||
|
<i data-lucide="shield-check"></i>
|
||||||
|
Safe Kiddo Control
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<div class="header-meta">
|
||||||
|
<div class="header-version" id="headerVersion">v-</div>
|
||||||
|
<div class="user-info" id="headerStatus">
|
||||||
|
<span id="currentUser">Nicht angemeldet</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- Metrics Dashboard -->
|
||||||
|
<div class="metrics">
|
||||||
|
<div class="metric-card" id="metricUsers">
|
||||||
|
<div class="label"><i data-lucide="users"></i> Verwaltbare Nutzer</div>
|
||||||
|
<div class="value">-</div>
|
||||||
|
</div>
|
||||||
|
<div class="metric-card" id="metricActive">
|
||||||
|
<div class="label"><i data-lucide="user-check"></i> Aktive Konten</div>
|
||||||
|
<div class="value">-</div>
|
||||||
|
</div>
|
||||||
|
<div class="metric-card warning" id="metricLocked">
|
||||||
|
<div class="label"><i data-lucide="lock"></i> Gesperrte Konten</div>
|
||||||
|
<div class="value">-</div>
|
||||||
|
</div>
|
||||||
|
<div class="metric-card" id="metricVersion">
|
||||||
|
<div class="label"><i data-lucide="package"></i> Version</div>
|
||||||
|
<div class="value text-muted" style="font-size: 1.25rem;">-</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- User Management Section -->
|
<!-- User Management Section -->
|
||||||
<section id="userSection" class="hidden">
|
<section id="userSection" class="hidden">
|
||||||
@ -271,12 +286,27 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Authentication
|
// Authentication
|
||||||
|
function showLanding() {
|
||||||
|
document.getElementById('loginLanding').classList.remove('hidden');
|
||||||
|
document.getElementById('appContainer').classList.add('hidden');
|
||||||
|
document.getElementById('headerVersion').textContent = 'v-';
|
||||||
|
history.replaceState(null, '', '#login');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showApp() {
|
||||||
|
document.getElementById('loginLanding').classList.add('hidden');
|
||||||
|
document.getElementById('appContainer').classList.remove('hidden');
|
||||||
|
if (window.location.hash !== '#app') {
|
||||||
|
history.replaceState(null, '', '#app');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function checkSession() {
|
async function checkSession() {
|
||||||
try {
|
try {
|
||||||
const data = await api('/me');
|
const data = await api('/me');
|
||||||
currentToken = sessionStorage.getItem('skdToken') || currentToken;
|
currentToken = sessionStorage.getItem('skdToken') || currentToken;
|
||||||
document.getElementById('currentUser').textContent = `Angemeldet als ${data.user} (${data.auth_mode})`;
|
document.getElementById('currentUser').textContent = `Angemeldet als ${data.user} (${data.auth_mode})`;
|
||||||
document.getElementById('loginSection').classList.add('hidden');
|
showApp();
|
||||||
document.getElementById('userSection').classList.remove('hidden');
|
document.getElementById('userSection').classList.remove('hidden');
|
||||||
document.getElementById('updateSection').classList.remove('hidden');
|
document.getElementById('updateSection').classList.remove('hidden');
|
||||||
await refreshUsers();
|
await refreshUsers();
|
||||||
@ -284,7 +314,7 @@
|
|||||||
return true;
|
return true;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
document.getElementById('currentUser').textContent = 'Nicht angemeldet';
|
document.getElementById('currentUser').textContent = 'Nicht angemeldet';
|
||||||
document.getElementById('loginSection').classList.remove('hidden');
|
showLanding();
|
||||||
document.getElementById('userSection').classList.add('hidden');
|
document.getElementById('userSection').classList.add('hidden');
|
||||||
document.getElementById('updateSection').classList.add('hidden');
|
document.getElementById('updateSection').classList.add('hidden');
|
||||||
return false;
|
return false;
|
||||||
@ -361,6 +391,7 @@
|
|||||||
try {
|
try {
|
||||||
const data = await api('/update/status');
|
const data = await api('/update/status');
|
||||||
document.querySelector('#metricVersion .value').textContent = data.current_version;
|
document.querySelector('#metricVersion .value').textContent = data.current_version;
|
||||||
|
document.getElementById('headerVersion').textContent = `v${data.current_version}`;
|
||||||
|
|
||||||
const statusBadge = data.last_status === 'success'
|
const statusBadge = data.last_status === 'success'
|
||||||
? '<span class="badge success"><i data-lucide="check-circle"></i> Erfolgreich</span>'
|
? '<span class="badge success"><i data-lucide="check-circle"></i> Erfolgreich</span>'
|
||||||
|
|||||||
Reference in New Issue
Block a user