1+ // app/layout.tsx
12import Providers from "@/lib/Providers" ;
23import "@/styles/globals.css" ;
34import { GeistSans } from "geist/font/sans" ;
45import { type Metadata } from "next" ;
56import { Toaster } from "react-hot-toast" ;
6- import { ThemeProvider } from "@/components/theme-provider"
7+ import { ThemeProvider } from "@/components/theme-provider" ;
8+ import {
9+ Sheet ,
10+ SheetContent ,
11+ SheetTrigger ,
12+ } from "@/components/ui/sheet" ;
13+ import { Button } from "@/components/ui/button" ;
14+ import Link from "next/link" ;
15+ import {
16+ Avatar ,
17+ AvatarFallback ,
18+ AvatarImage ,
19+ } from "@/components/ui/avatar" ;
20+ import {
21+ DropdownMenu ,
22+ DropdownMenuContent ,
23+ DropdownMenuItem ,
24+ DropdownMenuTrigger ,
25+ } from "@/components/ui/dropdown-menu" ;
26+ import { ScrollArea } from "@/components/ui/scroll-area" ;
27+ import {
28+ HomeIcon ,
29+ UsersIcon ,
30+ GroupIcon ,
31+ MenuIcon ,
32+ LogOutIcon ,
33+ } from "lucide-react" ;
34+
735
836export const metadata : Metadata = {
937 title : "CodeChef-VIT" ,
@@ -26,25 +54,110 @@ export const metadata: Metadata = {
2654 ] ,
2755} ;
2856
57+
2958export default function RootLayout ( {
30- children,
31- } : Readonly < { children : React . ReactNode } > ) {
32- return (
33- < html lang = "en" className = { `${ GeistSans . variable } ` } >
34- < body >
35- < div className = "bg-black " >
36- < Toaster position = "top-right" toastOptions = { { id : "_toast" } } />
37- < Providers >
38- < ThemeProvider
39- attribute = "class"
40- defaultTheme = "dark"
41- enableSystem
42- disableTransitionOnChange
43- >
59+ children,
60+ } : {
61+ children : React . ReactNode ;
62+ } ) {
63+ return (
64+ < html lang = "en" className = { `${ GeistSans . variable } ` } >
65+ < body >
66+ < Providers >
67+ < ThemeProvider
68+ attribute = "class"
69+ defaultTheme = "dark"
70+ enableSystem
71+ disableTransitionOnChange
72+ >
73+ < Toaster position = "top-right" toastOptions = { { id : "_toast" } } />
74+ < div className = "flex h-screen bg-black" >
75+ < Sidebar />
76+ < div className = "flex flex-col flex-1" >
77+ < Navbar />
78+ < main className = "flex-1 p-8" >
79+ { children }
80+ </ main >
81+ </ div >
82+ </ div >
83+ </ ThemeProvider >
84+ </ Providers >
85+ </ body >
86+ </ html >
87+ ) ;
88+ }
89+
4490
45- { children } </ ThemeProvider > </ Providers >
91+ function Sidebar ( ) {
92+ const navigation = [
93+ { name : "Dashboard" , href : "/dashboard" , icon : HomeIcon } ,
94+ { name : "Users" , href : "/users" , icon : UsersIcon } ,
95+ { name : "Teams" , href : "/teams" , icon : GroupIcon } ,
96+ ] ;
97+
98+ return (
99+ < aside className = "border-r border-gray-200 h-full w-64 dark:border-gray-700" >
100+ < ScrollArea className = "h-full" >
101+ < div className = "p-4" >
102+ < Link href = "/" className = "text-2xl font-bold mb-6 block" >
103+ CodeChef Admin
104+ </ Link >
105+ </ div >
106+ < nav className = "px-2 py-4" >
107+ { navigation . map ( ( item ) => (
108+ < Link
109+ key = { item . name }
110+ href = { item . href }
111+ className = "flex items-center space-x-2 px-3 py-2 rounded-md hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-200 font-medium text-gray-700 dark:text-gray-300"
112+ >
113+ < item . icon className = "h-4 w-4" />
114+ < span > { item . name } </ span >
115+ </ Link >
116+ ) ) }
117+ </ nav >
118+ </ ScrollArea >
119+ </ aside >
120+ ) ;
121+ }
122+ function Navbar ( ) {
123+ return (
124+ < nav className = "flex items-center justify-between border-b border-gray-200 dark:border-gray-700 p-4" >
125+ < div className = "block md:hidden" >
126+ < Sheet >
127+ < SheetTrigger asChild >
128+ < Button variant = "ghost" size = "icon" >
129+ < MenuIcon className = "h-5 w-5" />
130+ </ Button >
131+ </ SheetTrigger >
132+ < SheetContent side = "left" className = "p-0" >
133+ < Sidebar />
134+ </ SheetContent >
135+ </ Sheet >
136+ </ div >
137+
138+ < div className = "text-xl font-semibold text-gray-700 dark:text-white" >
139+ Admin Panel
140+ </ div >
141+ < div className = "flex items-center space-x-4" >
142+ < DropdownMenu >
143+ < DropdownMenuTrigger asChild >
144+ < Button variant = "ghost" className = "relative" >
145+ < Avatar >
146+ < AvatarImage src = "https://github.com/shadcn.png" />
147+ < AvatarFallback > CN</ AvatarFallback >
148+ </ Avatar >
149+ </ Button >
150+ </ DropdownMenuTrigger >
151+ < DropdownMenuContent align = "end" >
152+ < DropdownMenuItem >
153+ < Link href = "/api/auth/signout" className = "flex items-center" >
154+ < LogOutIcon className = "mr-2 h-4 w-4" />
155+ Log out
156+ </ Link >
157+ </ DropdownMenuItem >
158+ </ DropdownMenuContent >
159+ </ DropdownMenu >
46160 </ div >
47- </ body >
48- </ html >
49- ) ;
50- }
161+ </ nav >
162+ ) ;
163+ }
0 commit comments