This commit is contained in:
2026-03-04 02:30:30 +01:00
parent bbc50d624a
commit a04bb2dc73
3 changed files with 131 additions and 35 deletions

View File

@@ -25,34 +25,44 @@ if ($currentModule) {
<div class="bg-orb orb-a"></div>
<div class="bg-orb orb-b"></div>
<div class="app-shell">
<header class="topbar">
<header class="topbar card">
<div class="topbar-left">
<img src="/assets/images/logo.png" alt="Nexus Logo" class="topbar-logo">
<?php if ($currentModule && !empty($module['title'])): ?>
<h1 class="page-title"><?= e($module['title']) ?></h1>
<span class="pill">Modul</span>
<?php else: ?>
<h1 class="page-title"><?= htmlspecialchars(t('common.title'), ENT_QUOTES) ?></h1>
<span class="pill">Dashboard</span>
<?php endif; ?>
</div>
<div class="topbar-actions">
<a class="nav-link" href="/">Dashboard</a>
<div class="dropdown">
<button class="nav-link dropdown-toggle" type="button">Module ▾</button>
<div class="dropdown-menu">
<?php foreach (modules()->all() as $m): ?>
<?php if (!empty($m['enabled'])): ?>
<a class="dropdown-item" href="/module/<?= e($m['name']) ?>"><?= e($m['title']) ?></a>
<?php endif; ?>
<?php endforeach; ?>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/modules">Module Übersicht</a>
<a class="dropdown-item" href="/modules/install">Modul installieren/aktivieren</a>
<a class="dropdown-item" href="/settings">Settings</a>
</div>
</div>
<div class="dropdown">
<?php if (auth_enabled() && auth_user()): ?>
<span class="pill"><?= e(auth_user()['email'] ?? '') ?></span>
<a class="nav-link" href="/auth/logout">Logout</a>
<button class="avatar-btn" type="button">
<span class="avatar"><?= e(auth_initials()) ?></span>
</button>
<div class="dropdown-menu dropdown-menu-right">
<div class="dropdown-header"><?= e(auth_display_name()) ?></div>
<a class="dropdown-item" href="/settings">Settings</a>
<a class="dropdown-item" href="/auth/logout">Logout</a>
</div>
<?php elseif (auth_enabled()): ?>
<a class="nav-link" href="/auth/login">Login</a>
<?php endif; ?>
<a class="nav-link" href="/users">User</a>
<a class="nav-link" href="/modules">Module</a>
<a class="nav-link" href="/modules/install">Modul installieren/aktivieren</a>
</div>
</div>
</header>
<aside class="app-sidebar">
<div class="brand-text">
<div class="brand-title"><?= htmlspecialchars(t('common.title'), ENT_QUOTES) ?></div>
<div class="brand-sub">Nexus Control Panel</div>
</div>
<div class="brand-text"></div>
<button class="sidebar-toggle" data-sidebar-toggle aria-label="Menü ein-/ausklappen">
<span class="sidebar-icon">☰</span>

View File

@@ -133,7 +133,7 @@ body {
.topbar-logo {
height: 40px;
width: auto;
filter: drop-shadow(0 8px 18px rgba(0,0,0,0.12));
filter: drop-shadow(0 6px 12px rgba(0,0,0,0.12));
margin-right: 10px;
}
.brand img {
@@ -207,7 +207,7 @@ body {
grid-column: 1 / -1;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 16px;
border-radius: 18px;
padding: 10px 18px;
display: flex;
align-items: center;
@@ -216,18 +216,6 @@ body {
box-shadow: var(--shadow);
min-height: 64px;
}
.topbar::before {
content: "";
position: absolute;
inset: -1px;
border-radius: 16px;
padding: 1px;
background: linear-gradient(135deg, rgba(255, 107, 74, 0.35), rgba(15, 180, 164, 0.25), rgba(255, 107, 74, 0.2));
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
}
.topbar { position: relative; }
.page-title {
margin: 0;
@@ -239,6 +227,70 @@ body {
flex-wrap: wrap;
}
.dropdown {
position: relative;
display: inline-flex;
}
.dropdown-toggle {
background: transparent;
}
.dropdown-menu {
position: absolute;
top: 110%;
right: 0;
min-width: 220px;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 12px;
box-shadow: var(--shadow);
padding: 8px;
display: none;
z-index: 30;
}
.dropdown-menu-right { right: 0; left: auto; }
.dropdown:hover .dropdown-menu,
.dropdown:focus-within .dropdown-menu {
display: block;
}
.dropdown-item {
display: block;
padding: 8px 10px;
border-radius: 10px;
color: var(--text);
text-decoration: none;
font-weight: 600;
}
.dropdown-item:hover {
background: var(--panel-2);
}
.dropdown-divider {
height: 1px;
background: var(--line);
margin: 6px 4px;
}
.dropdown-header {
padding: 6px 10px;
font-size: 0.85rem;
color: var(--muted);
}
.avatar-btn {
background: transparent;
border: none;
padding: 0;
cursor: pointer;
}
.avatar {
width: 34px;
height: 34px;
border-radius: 50%;
background: var(--accent);
color: #ffffff;
display: inline-flex;
align-items: center;
justify-content: center;
font-weight: 700;
}
.module-subnav {
display: flex;
gap: 10px;

View File

@@ -74,6 +74,40 @@ function auth_user(): ?array
return $_SESSION['auth_user'] ?? null;
}
function auth_display_name(): string
{
$user = auth_user();
if (!$user) {
return '';
}
$name = trim((string)($user['name'] ?? ''));
if ($name !== '') {
return $name;
}
$email = trim((string)($user['email'] ?? ''));
return $email;
}
function auth_initials(): string
{
$name = auth_display_name();
if ($name === '') {
return 'U';
}
$parts = preg_split('/\s+/', $name) ?: [];
$letters = '';
foreach ($parts as $p) {
$p = trim($p);
if ($p !== '') {
$letters .= mb_strtoupper(mb_substr($p, 0, 1));
}
if (mb_strlen($letters) >= 2) {
break;
}
}
return $letters !== '' ? $letters : 'U';
}
function auth_groups(): array
{
$user = auth_user();