Upload src/layouts/AppLayout.tsx with huggingface_hub
Browse files- src/layouts/AppLayout.tsx +37 -0
src/layouts/AppLayout.tsx
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { Outlet } from "react-router-dom";
|
| 2 |
+
import { useState } from "react";
|
| 3 |
+
import Sidebar from "../components/Sidebar";
|
| 4 |
+
import TopBar from "../components/TopBar";
|
| 5 |
+
import GeometricBackground from "../components/GeometricBackground";
|
| 6 |
+
import BackgroundElements from "../components/BackgroundElements";
|
| 7 |
+
|
| 8 |
+
export default function AppLayout() {
|
| 9 |
+
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
|
| 10 |
+
|
| 11 |
+
return (
|
| 12 |
+
<div className="flex h-screen bg-transparent text-zinc-100 overflow-hidden relative">
|
| 13 |
+
<GeometricBackground />
|
| 14 |
+
<BackgroundElements />
|
| 15 |
+
|
| 16 |
+
{/* Mobile overlay */}
|
| 17 |
+
{isSidebarOpen && (
|
| 18 |
+
<div
|
| 19 |
+
className="fixed inset-0 bg-black/60 z-30 md:hidden backdrop-blur-sm"
|
| 20 |
+
onClick={() => setIsSidebarOpen(false)}
|
| 21 |
+
/>
|
| 22 |
+
)}
|
| 23 |
+
|
| 24 |
+
{/* Sidebar with mobile slide transition */}
|
| 25 |
+
<div className={`fixed inset-y-0 left-0 z-40 transform transition-transform duration-300 ease-in-out md:relative md:translate-x-0 ${isSidebarOpen ? "translate-x-0" : "-translate-x-full"}`}>
|
| 26 |
+
<Sidebar onClose={() => setIsSidebarOpen(false)} />
|
| 27 |
+
</div>
|
| 28 |
+
|
| 29 |
+
<div className="flex flex-col flex-1 min-w-0 overflow-hidden w-full">
|
| 30 |
+
<TopBar onMenuClick={() => setIsSidebarOpen(true)} />
|
| 31 |
+
<main className="page-shell flex-1 overflow-y-auto bg-transparent relative z-10 w-full p-2 md:p-0">
|
| 32 |
+
<Outlet />
|
| 33 |
+
</main>
|
| 34 |
+
</div>
|
| 35 |
+
</div>
|
| 36 |
+
);
|
| 37 |
+
}
|