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
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>
This commit is contained in:
@@ -22,11 +22,47 @@
|
|||||||
children?: import('svelte').Snippet;
|
children?: import('svelte').Snippet;
|
||||||
}
|
}
|
||||||
let { children }: Props = $props();
|
let { children }: Props = $props();
|
||||||
|
|
||||||
|
let sidebarOpen = $state(false);
|
||||||
</script>
|
</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">
|
<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 -->
|
<!-- 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 -->
|
<!-- Internal pages -->
|
||||||
<div>
|
<div>
|
||||||
<p class="px-2 mb-2 text-xs font-semibold text-(--color-muted) uppercase tracking-widest">{m.admin_pages_label()}</p>
|
<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}
|
{#each internalLinks as link}
|
||||||
<a
|
<a
|
||||||
href={link.href}
|
href={link.href}
|
||||||
|
onclick={() => (sidebarOpen = false)}
|
||||||
class="px-2 py-1.5 rounded-md text-sm font-medium transition-colors
|
class="px-2 py-1.5 rounded-md text-sm font-medium transition-colors
|
||||||
{page.url.pathname.startsWith(link.href)
|
{page.url.pathname.startsWith(link.href)
|
||||||
? 'bg-(--color-surface-2) text-(--color-text)'
|
? 'bg-(--color-surface-2) text-(--color-text)'
|
||||||
@@ -68,7 +105,7 @@
|
|||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<!-- Main content -->
|
<!-- 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?.()}
|
{@render children?.()}
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user