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 (
-
+
);
}
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}
+
+
+ );
+}