Add top bar logout button

This commit is contained in:
DonVoo 2026-07-13 01:35:21 +02:00
parent e7611b2d49
commit b475b03b9e
3 changed files with 33 additions and 24 deletions

View file

@ -66,9 +66,9 @@ func renderShell(w http.ResponseWriter, active, readingPane string) {
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Mail-Graveyard</title> <title>Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"> <link rel="stylesheet" href="/static/style.css?v=20260712-19">
<script src="/static/htmx.min.js"></script> <script src="/static/htmx.min.js"></script>
<script src="/static/app.js?v=20260712-18" defer></script></head> <script src="/static/app.js?v=20260712-19" defer></script></head>
<body class="ol2013"> <body class="ol2013">
<header class="ribbon"> <header class="ribbon">
<button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button> <button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button>
@ -77,7 +77,7 @@ func renderShell(w http.ResponseWriter, active, readingPane string) {
%s %s
<a class="tab" href="/users">Einstellungen</a> <a class="tab" href="/users">Einstellungen</a>
</nav> </nav>
<div class="ribbon-title">Mail-Graveyard</div> <div class="ribbon-title">Mail-Graveyard</div><a class="ribbon-logout" href="/logout">Logout</a>
</header> </header>
<aside class="backstage-menu" aria-label="Mail-Graveyard-Menue"> <aside class="backstage-menu" aria-label="Mail-Graveyard-Menue">
<a class="backstage-item active" href="/view">Archiv-Boxen</a> <a class="backstage-item active" href="/view">Archiv-Boxen</a>
@ -511,9 +511,9 @@ func renderAccountsPage(w http.ResponseWriter, accounts []Account, edit Account,
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Konten-Verwaltung - Mail-Graveyard</title> <title>Konten-Verwaltung - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"> <link rel="stylesheet" href="/static/style.css?v=20260712-19">
<script src="/static/htmx.min.js"></script> <script src="/static/htmx.min.js"></script>
<script src="/static/app.js?v=20260712-18" defer></script></head> <script src="/static/app.js?v=20260712-19" defer></script></head>
<body class="ol2013"> <body class="ol2013">
<header class="ribbon"> <header class="ribbon">
<button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button> <button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button>
@ -522,7 +522,7 @@ func renderAccountsPage(w http.ResponseWriter, accounts []Account, edit Account,
%s %s
<a class="tab" href="/users">Einstellungen</a> <a class="tab" href="/users">Einstellungen</a>
</nav> </nav>
<div class="ribbon-title">Mail-Graveyard</div> <div class="ribbon-title">Mail-Graveyard</div><a class="ribbon-logout" href="/logout">Logout</a>
</header> </header>
<aside class="backstage-menu" aria-label="Mail-Graveyard-Menue"> <aside class="backstage-menu" aria-label="Mail-Graveyard-Menue">
<a class="backstage-item" href="/view">Archiv-Boxen</a> <a class="backstage-item" href="/view">Archiv-Boxen</a>
@ -556,9 +556,9 @@ func renderArchivesPage(w http.ResponseWriter, archives []string, accounts []Acc
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Archiv-mbox Verwaltung - Mail-Graveyard</title> <title>Archiv-mbox Verwaltung - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"> <link rel="stylesheet" href="/static/style.css?v=20260712-19">
<script src="/static/htmx.min.js"></script> <script src="/static/htmx.min.js"></script>
<script src="/static/app.js?v=20260712-18" defer></script></head> <script src="/static/app.js?v=20260712-19" defer></script></head>
<body class="ol2013"> <body class="ol2013">
<header class="ribbon"> <header class="ribbon">
<button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button> <button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button>
@ -567,7 +567,7 @@ func renderArchivesPage(w http.ResponseWriter, archives []string, accounts []Acc
%s %s
<a class="tab" href="/users">Einstellungen</a> <a class="tab" href="/users">Einstellungen</a>
</nav> </nav>
<div class="ribbon-title">Mail-Graveyard</div> <div class="ribbon-title">Mail-Graveyard</div><a class="ribbon-logout" href="/logout">Logout</a>
</header> </header>
<aside class="backstage-menu" aria-label="Mail-Graveyard-Menue"> <aside class="backstage-menu" aria-label="Mail-Graveyard-Menue">
<a class="backstage-item" href="/view">Archiv-Boxen</a> <a class="backstage-item" href="/view">Archiv-Boxen</a>
@ -604,9 +604,9 @@ func renderUsersPage(w http.ResponseWriter, r *http.Request, users []AppUser, ed
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Benutzerverwaltung - Mail-Graveyard</title> <title>Benutzerverwaltung - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"> <link rel="stylesheet" href="/static/style.css?v=20260712-19">
<script src="/static/htmx.min.js"></script> <script src="/static/htmx.min.js"></script>
<script src="/static/app.js?v=20260712-18" defer></script></head> <script src="/static/app.js?v=20260712-19" defer></script></head>
<body class="ol2013"> <body class="ol2013">
<header class="ribbon"> <header class="ribbon">
<button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button> <button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button>
@ -615,7 +615,7 @@ func renderUsersPage(w http.ResponseWriter, r *http.Request, users []AppUser, ed
%s %s
<a class="tab active" href="/users">Einstellungen</a> <a class="tab active" href="/users">Einstellungen</a>
</nav> </nav>
<div class="ribbon-title">Mail-Graveyard</div> <div class="ribbon-title">Mail-Graveyard</div><a class="ribbon-logout" href="/logout">Logout</a>
</header> </header>
<aside class="backstage-menu" aria-label="Mail-Graveyard-Menue"> <aside class="backstage-menu" aria-label="Mail-Graveyard-Menue">
<a class="backstage-item" href="/view">Archiv-Boxen</a> <a class="backstage-item" href="/view">Archiv-Boxen</a>
@ -674,9 +674,9 @@ func renderTransferPage(w http.ResponseWriter, mode transferMode, accounts []Acc
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>%s - Mail-Graveyard</title> <title>%s - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"> <link rel="stylesheet" href="/static/style.css?v=20260712-19">
<script src="/static/htmx.min.js"></script> <script src="/static/htmx.min.js"></script>
<script src="/static/app.js?v=20260712-18" defer></script></head> <script src="/static/app.js?v=20260712-19" defer></script></head>
<body class="ol2013"> <body class="ol2013">
<header class="ribbon"> <header class="ribbon">
<button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button> <button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button>
@ -685,7 +685,7 @@ func renderTransferPage(w http.ResponseWriter, mode transferMode, accounts []Acc
%s %s
<a class="tab" href="/users">Einstellungen</a> <a class="tab" href="/users">Einstellungen</a>
</nav> </nav>
<div class="ribbon-title">Mail-Graveyard</div> <div class="ribbon-title">Mail-Graveyard</div><a class="ribbon-logout" href="/logout">Logout</a>
</header> </header>
<aside class="backstage-menu" aria-label="Mail-Graveyard-Menue"> <aside class="backstage-menu" aria-label="Mail-Graveyard-Menue">
<a class="backstage-item" href="/view">Archiv-Boxen</a> <a class="backstage-item" href="/view">Archiv-Boxen</a>
@ -715,9 +715,9 @@ func renderSourceEmailBoxPage(w http.ResponseWriter, accounts []Account) {
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Quell-Postfach - Mail-Graveyard</title> <title>Quell-Postfach - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"> <link rel="stylesheet" href="/static/style.css?v=20260712-19">
<script src="/static/htmx.min.js"></script> <script src="/static/htmx.min.js"></script>
<script src="/static/app.js?v=20260712-18" defer></script></head> <script src="/static/app.js?v=20260712-19" defer></script></head>
<body class="ol2013"> <body class="ol2013">
<header class="ribbon"> <header class="ribbon">
<button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button> <button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button>
@ -726,7 +726,7 @@ func renderSourceEmailBoxPage(w http.ResponseWriter, accounts []Account) {
%s %s
<a class="tab" href="/users">Einstellungen</a> <a class="tab" href="/users">Einstellungen</a>
</nav> </nav>
<div class="ribbon-title">Mail-Graveyard</div> <div class="ribbon-title">Mail-Graveyard</div><a class="ribbon-logout" href="/logout">Logout</a>
</header> </header>
<aside class="backstage-menu" aria-label="Mail-Graveyard-Menue"> <aside class="backstage-menu" aria-label="Mail-Graveyard-Menue">
<a class="backstage-item" href="/view">Archiv-Boxen</a> <a class="backstage-item" href="/view">Archiv-Boxen</a>
@ -757,9 +757,9 @@ func renderTargetEmailBoxPage(w http.ResponseWriter, accounts []Account) {
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Ziel-Postfach - Mail-Graveyard</title> <title>Ziel-Postfach - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"> <link rel="stylesheet" href="/static/style.css?v=20260712-19">
<script src="/static/htmx.min.js"></script> <script src="/static/htmx.min.js"></script>
<script src="/static/app.js?v=20260712-18" defer></script></head> <script src="/static/app.js?v=20260712-19" defer></script></head>
<body class="ol2013"> <body class="ol2013">
<header class="ribbon"> <header class="ribbon">
<button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button> <button class="app-menu-button" type="button" aria-label="Mail-Graveyard-Menue" aria-expanded="false" data-backstage-toggle><span class="mail-logo" aria-hidden="true"></span></button>
@ -768,7 +768,7 @@ func renderTargetEmailBoxPage(w http.ResponseWriter, accounts []Account) {
%s %s
<a class="tab" href="/users">Einstellungen</a> <a class="tab" href="/users">Einstellungen</a>
</nav> </nav>
<div class="ribbon-title">Mail-Graveyard</div> <div class="ribbon-title">Mail-Graveyard</div><a class="ribbon-logout" href="/logout">Logout</a>
</header> </header>
<aside class="backstage-menu" aria-label="Mail-Graveyard-Menue"> <aside class="backstage-menu" aria-label="Mail-Graveyard-Menue">
<a class="backstage-item" href="/view">Archiv-Boxen</a> <a class="backstage-item" href="/view">Archiv-Boxen</a>

View file

@ -239,7 +239,7 @@ func renderLoginPage(w http.ResponseWriter, errMsg string) {
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Login - Mail-Graveyard</title> <title>Login - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"></head> <link rel="stylesheet" href="/static/style.css?v=20260712-19"></head>
<body class="ol2013 login-body"> <body class="ol2013 login-body">
<main class="login-card"> <main class="login-card">
<div class="login-brand"><span class="mail-logo" aria-hidden="true"></span><strong>Mail-Graveyard</strong></div> <div class="login-brand"><span class="mail-logo" aria-hidden="true"></span><strong>Mail-Graveyard</strong></div>
@ -259,7 +259,7 @@ func renderForgotPasswordPage(w http.ResponseWriter, msg string) {
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Passwort vergessen - Mail-Graveyard</title> <title>Passwort vergessen - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"></head> <link rel="stylesheet" href="/static/style.css?v=20260712-19"></head>
<body class="ol2013 login-body"> <body class="ol2013 login-body">
<main class="login-card"> <main class="login-card">
<div class="login-brand"><span class="mail-logo" aria-hidden="true"></span><strong>Mail-Graveyard</strong></div> <div class="login-brand"><span class="mail-logo" aria-hidden="true"></span><strong>Mail-Graveyard</strong></div>
@ -278,7 +278,7 @@ func renderResetPasswordPage(w http.ResponseWriter, token, errMsg string) {
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8"> fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="viewport" content="width=device-width,initial-scale=1">
<title>Passwort setzen - Mail-Graveyard</title> <title>Passwort setzen - Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-18"></head> <link rel="stylesheet" href="/static/style.css?v=20260712-19"></head>
<body class="ol2013 login-body"> <body class="ol2013 login-body">
<main class="login-card"> <main class="login-card">
<div class="login-brand"><span class="mail-logo" aria-hidden="true"></span><strong>Mail-Graveyard</strong></div> <div class="login-brand"><span class="mail-logo" aria-hidden="true"></span><strong>Mail-Graveyard</strong></div>

View file

@ -70,6 +70,15 @@ body.ol2013 {
z-index: 20; z-index: 20;
} }
.ribbon-title { margin-left: auto; font-weight: 700; font-size: 15px; letter-spacing: .2px; } .ribbon-title { margin-left: auto; font-weight: 700; font-size: 15px; letter-spacing: .2px; }
.ribbon-logout {
color: #fff;
text-decoration: none;
padding: 6px 10px;
border: 1px solid rgba(255, 255, 255, .35);
}
.ribbon-logout:hover {
background: var(--ol-blue-dark);
}
.ribbon-tabs { display: flex; gap: 2px; height: 100%; } .ribbon-tabs { display: flex; gap: 2px; height: 100%; }
.app-menu-button { .app-menu-button {
width: 54px; width: 54px;