From adbd651350f331d7e310c1b1b902b9ce63445f3a Mon Sep 17 00:00:00 2001 From: openhands Date: Mon, 13 Jul 2026 19:17:27 +0200 Subject: [PATCH] Add mobile sidebar toggle for admin panel --- src/app/admin/layout.tsx | 6 +- src/components/admin/admin-mobile-wrapper.tsx | 59 +++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/components/admin/admin-mobile-wrapper.tsx diff --git a/src/app/admin/layout.tsx b/src/app/admin/layout.tsx index 3aed70b9..28d030e2 100644 --- a/src/app/admin/layout.tsx +++ b/src/app/admin/layout.tsx @@ -3,6 +3,7 @@ import { redirect } from "next/navigation"; import type { ReactNode } from "react"; import { getTranslations } from "next-intl/server"; import { AdminNavLink } from "@/components/admin/admin-nav-link"; +import { AdminMobileWrapper } from "@/components/admin/admin-mobile-wrapper"; import { requireStaff } from "@/lib/admin/guard"; import { prisma } from "@/lib/prisma"; import { siteSettings } from "@/lib/services/site-settings"; @@ -163,13 +164,12 @@ export default async function AdminLayout({ children }: { children: ReactNode }) } return ( -
- + }>
{children}
-
+ ); } diff --git a/src/components/admin/admin-mobile-wrapper.tsx b/src/components/admin/admin-mobile-wrapper.tsx new file mode 100644 index 00000000..332567c3 --- /dev/null +++ b/src/components/admin/admin-mobile-wrapper.tsx @@ -0,0 +1,59 @@ +"use client"; + +import { useState, useEffect, type ReactNode } from "react"; +import { Menu, X } from "lucide-react"; + +export function AdminMobileWrapper({ + sidebar, + children, +}: { + sidebar: ReactNode; + children: ReactNode; +}) { + const [open, setOpen] = useState(false); + + useEffect(() => { + if (!open) return; + const handler = (e: KeyboardEvent) => { + if (e.key === "Escape") setOpen(false); + }; + document.addEventListener("keydown", handler); + return () => document.removeEventListener("keydown", handler); + }, [open]); + + return ( +
+ {/* Mobile header */} +
+ + Admin Panel +
+ + {/* Backdrop */} + {open && ( +
setOpen(false)} /> + )} + + {/* Sidebar */} +
+ {sidebar} +
+ + {/* Content */} +
+ {children} +
+
+ ); +}