+
+ }
+ >
+ {children}
+
);
}
diff --git a/src/components/dashboard/DashboardSidebarDrawer.tsx b/src/components/dashboard/DashboardSidebarDrawer.tsx
new file mode 100644
index 0000000..696c4b3
--- /dev/null
+++ b/src/components/dashboard/DashboardSidebarDrawer.tsx
@@ -0,0 +1,69 @@
+"use client";
+
+import { useEffect, useState, type ReactNode } from "react";
+import { usePathname } from "next/navigation";
+import { Menu } from "lucide-react";
+
+import { LogoMark } from "@/components/ui/LogoMark";
+import { cn } from "@/lib/utils";
+
+/**
+ * Dashboard layout shell with a responsive sidebar: a normal static column on
+ * desktop (lg+), and an off-canvas drawer with a hamburger top bar on mobile.
+ *
+ * The closed-state transform is applied only via `max-lg:` so there is no `lg:`
+ * transform to conflict with — this sidesteps the RTL/`lg:` specificity trap
+ * (see AdminShell) and works for both fa (RTL) and en (LTR).
+ */
+export function DashboardSidebarDrawer({
+ sidebar,
+ children,
+}: {
+ sidebar: ReactNode;
+ children: ReactNode;
+}) {
+ const [open, setOpen] = useState(false);
+ const pathname = usePathname();
+
+ // Close the drawer after navigating (the dashboard layout persists across routes).
+ useEffect(() => setOpen(false), [pathname]);
+
+ return (
+