55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
// * Packages
|
|
import { motion } from "motion/react";
|
|
import { ReactNode } from "react";
|
|
// * Components shadcn
|
|
import { SidebarProvider } from "@/components/ui/sidebar";
|
|
import { Toaster } from "@/components/ui/toaster";
|
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
// * Other
|
|
import AppSidebar from "@/back/Components/Layout/AppSidebar";
|
|
import AppHeader from "@/back/Components/Layout/AppHeader";
|
|
import AppFooter from "@/back/Components/Layout/AppFooter";
|
|
import AppTitle from "@/back/Components/Layout/AppTitle";
|
|
import { ThemeProvider } from "@/back/providers/ThemeProvider";
|
|
|
|
export default function Layout({
|
|
title,
|
|
linkBefore,
|
|
linkAfter,
|
|
children,
|
|
}: {
|
|
title: string;
|
|
linkBefore?: string;
|
|
linkAfter?: string;
|
|
children: ReactNode;
|
|
}) {
|
|
const isCollapsed = localStorage.getItem("vite-ui-collapsed");
|
|
return (
|
|
<ThemeProvider>
|
|
<SidebarProvider defaultOpen={!isCollapsed}>
|
|
<TooltipProvider>
|
|
<AppSidebar />
|
|
<motion.main
|
|
initial={{ opacity: 0 }}
|
|
animate={{ opacity: 1 }}
|
|
exit={{ opacity: 0 }}
|
|
transition={{ duration: 0.3 }}
|
|
className="relative container flex flex-col justify-between mx-auto px-8 pb-4"
|
|
>
|
|
<div className="flex flex-col justify-between">
|
|
<AppHeader />
|
|
<AppTitle
|
|
title={title}
|
|
linkBefore={linkBefore}
|
|
linkAfter={linkAfter}
|
|
/>
|
|
{children}
|
|
</div>
|
|
<Toaster />
|
|
<AppFooter />
|
|
</motion.main>
|
|
</TooltipProvider>
|
|
</SidebarProvider>
|
|
</ThemeProvider>
|
|
);
|
|
}
|