Compare commits

..

2 Commits

Author SHA1 Message Date
Admin
8b597c0bd2 fix(caddy): fix logo branding on all error pages
All checks were successful
Release / Test backend (push) Successful in 23s
CI / Backend (push) Successful in 41s
CI / UI (push) Successful in 49s
Release / Check ui (push) Successful in 27s
CI / UI (pull_request) Successful in 27s
CI / Backend (pull_request) Successful in 47s
Release / Docker / caddy (push) Successful in 1m7s
Release / Docker / backend (push) Successful in 1m48s
Release / Docker / ui (push) Successful in 2m2s
Release / Docker / runner (push) Successful in 3m9s
Release / Gitea Release (push) Successful in 13s
Match main site logo style: lowercase 'libnovel' in full brand amber.
Add meta http-equiv refresh fallback for 5xx pages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 16:39:38 +05:00
Admin
28cafe2aa8 fix(admin): make sidebar responsive on mobile with slide-out drawer
All checks were successful
CI / Backend (push) Successful in 50s
CI / UI (push) Successful in 25s
Release / Test backend (push) Successful in 39s
Release / Docker / caddy (push) Successful in 32s
Release / Check ui (push) Successful in 47s
CI / UI (pull_request) Successful in 27s
CI / Backend (pull_request) Successful in 43s
Release / Docker / runner (push) Successful in 2m1s
Release / Docker / ui (push) Successful in 2m30s
Release / Docker / backend (push) Successful in 3m3s
Release / Gitea Release (push) Successful in 13s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 16:33:17 +05:00
6 changed files with 58 additions and 22 deletions

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>404 — Page Not Found — LibNovel</title>
<title>404 — Page Not Found — libnovel</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
@@ -27,11 +27,10 @@
.logo {
font-size: 1.125rem;
font-weight: 700;
color: #e4e4e7;
color: #f59e0b;
letter-spacing: -0.02em;
text-decoration: none;
}
.logo span { color: #f59e0b; }
main {
flex: 1;
@@ -114,7 +113,7 @@
<body>
<header>
<a class="logo" href="/">Lib<span>Novel</span></a>
<a class="logo" href="/">libnovel</a>
</header>
<main>

View File

@@ -3,7 +3,8 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>500 — Internal Error — LibNovel</title>
<title>500 — Internal Error — libnovel</title>
<meta http-equiv="refresh" content="20">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
@@ -27,11 +28,10 @@
.logo {
font-size: 1.125rem;
font-weight: 700;
color: #e4e4e7;
color: #f59e0b;
letter-spacing: -0.02em;
text-decoration: none;
}
.logo span { color: #f59e0b; }
main {
flex: 1;
@@ -147,7 +147,7 @@
<body>
<header>
<a class="logo" href="/">Lib<span>Novel</span></a>
<a class="logo" href="/">libnovel</a>
</header>
<main>

View File

@@ -3,7 +3,8 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>502 — Service Unavailable — LibNovel</title>
<title>502 — Service Unavailable — libnovel</title>
<meta http-equiv="refresh" content="20">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
@@ -27,11 +28,10 @@
.logo {
font-size: 1.125rem;
font-weight: 700;
color: #e4e4e7;
color: #f59e0b;
letter-spacing: -0.02em;
text-decoration: none;
}
.logo span { color: #f59e0b; }
main {
flex: 1;
@@ -126,7 +126,7 @@
<body>
<header>
<a class="logo" href="/">Lib<span>Novel</span></a>
<a class="logo" href="/">libnovel</a>
</header>
<main>

View File

@@ -3,7 +3,8 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Under Maintenance — LibNovel</title>
<title>Under Maintenance — libnovel</title>
<meta http-equiv="refresh" content="30">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
@@ -28,11 +29,10 @@
.logo {
font-size: 1.125rem;
font-weight: 700;
color: #e4e4e7;
color: #f59e0b;
letter-spacing: -0.02em;
text-decoration: none;
}
.logo span { color: #f59e0b; }
/* ── Main ── */
main {
@@ -129,7 +129,7 @@
<body>
<header>
<a class="logo" href="/">Lib<span>Novel</span></a>
<a class="logo" href="/">libnovel</a>
</header>
<main>

View File

@@ -3,7 +3,8 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>504 — Gateway Timeout — LibNovel</title>
<title>504 — Gateway Timeout — libnovel</title>
<meta http-equiv="refresh" content="20">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
@@ -27,11 +28,10 @@
.logo {
font-size: 1.125rem;
font-weight: 700;
color: #e4e4e7;
color: #f59e0b;
letter-spacing: -0.02em;
text-decoration: none;
}
.logo span { color: #f59e0b; }
main {
flex: 1;
@@ -126,7 +126,7 @@
<body>
<header>
<a class="logo" href="/">Lib<span>Novel</span></a>
<a class="logo" href="/">libnovel</a>
</header>
<main>

View File

@@ -22,11 +22,47 @@
children?: import('svelte').Snippet;
}
let { children }: Props = $props();
let sidebarOpen = $state(false);
</script>
<!-- Mobile sidebar overlay -->
{#if sidebarOpen}
<button
class="fixed inset-0 z-20 bg-black/50 md:hidden"
onclick={() => (sidebarOpen = false)}
aria-label="Close sidebar"
></button>
{/if}
<div class="flex min-h-[calc(100vh-4rem)] gap-0">
<!-- Mobile top bar -->
<div class="md:hidden fixed top-0 left-0 right-0 z-10 h-16 flex items-center px-4 border-b border-(--color-border) bg-(--color-bg)">
<button
onclick={() => (sidebarOpen = !sidebarOpen)}
class="p-2 rounded-md text-(--color-muted) hover:text-(--color-text) hover:bg-(--color-surface-2) transition-colors"
aria-label="Toggle navigation"
>
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
{#if sidebarOpen}
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
{:else}
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
{/if}
</svg>
</button>
<span class="ml-3 text-sm font-semibold text-(--color-muted) uppercase tracking-widest">Admin</span>
</div>
<!-- Sidebar -->
<aside class="w-48 shrink-0 border-r border-(--color-border) px-3 py-6 flex flex-col gap-6">
<aside
class="
fixed top-0 left-0 h-full z-30 w-56 shrink-0 border-r border-(--color-border) px-3 py-6 flex flex-col gap-6
bg-(--color-bg) transition-transform duration-200
{sidebarOpen ? 'translate-x-0' : '-translate-x-full'}
md:relative md:translate-x-0 md:w-48 md:z-auto md:top-auto md:h-auto
"
>
<!-- Internal pages -->
<div>
<p class="px-2 mb-2 text-xs font-semibold text-(--color-muted) uppercase tracking-widest">{m.admin_pages_label()}</p>
@@ -34,6 +70,7 @@
{#each internalLinks as link}
<a
href={link.href}
onclick={() => (sidebarOpen = false)}
class="px-2 py-1.5 rounded-md text-sm font-medium transition-colors
{page.url.pathname.startsWith(link.href)
? 'bg-(--color-surface-2) text-(--color-text)'
@@ -68,7 +105,7 @@
</aside>
<!-- Main content -->
<main class="flex-1 min-w-0 px-8 py-6">
<main class="flex-1 min-w-0 px-4 py-6 md:px-8 pt-20 md:pt-6">
{@render children?.()}
</main>
</div>