1- import { Link , usePage } from '@inertiajs/react' ;
2- import { type BreadcrumbItem } from '@/types' ;
3- import AppLogo from './app-logo' ;
4- import AppLogoIcon from './app-logo-icon' ;
5- import { Button } from "@/components/ui/button"
61import { Breadcrumbs } from '@/components/breadcrumbs' ;
2+ import { Icon } from '@/components/icon' ;
3+ import { Avatar , AvatarFallback , AvatarImage } from '@/components/ui/avatar' ;
4+ import { Button } from '@/components/ui/button' ;
5+ import { DropdownMenu , DropdownMenuContent , DropdownMenuTrigger } from '@/components/ui/dropdown-menu' ;
76import {
87 NavigationMenu ,
98 NavigationMenuItem ,
109 NavigationMenuLink ,
1110 NavigationMenuList ,
1211 navigationMenuTriggerStyle ,
13- } from "@/components/ui/navigation-menu"
14- import {
15- DropdownMenu ,
16- DropdownMenuContent ,
17- DropdownMenuTrigger ,
18- } from "@/components/ui/dropdown-menu"
19- import {
20- Tooltip ,
21- TooltipContent ,
22- TooltipProvider ,
23- TooltipTrigger ,
24- } from "@/components/ui/tooltip"
25- import { type NavItem } from '@/types' ;
26- import {
27- Sheet ,
28- SheetContent ,
29- SheetHeader ,
30- SheetTitle ,
31- SheetTrigger ,
32- } from "@/components/ui/sheet"
33- import { type SharedData } from '@/types' ;
34- import { Avatar , AvatarFallback , AvatarImage } from "@/components/ui/avatar"
35- import { Menu , ChevronDown , FolderGit2 , BookOpenText , Search , LayoutGrid } from 'lucide-react'
36- import { useInitials } from '@/hooks/use-initials' ;
37- import { cn } from "@/lib/utils" ;
12+ } from '@/components/ui/navigation-menu' ;
13+ import { Sheet , SheetContent , SheetHeader , SheetTitle , SheetTrigger } from '@/components/ui/sheet' ;
14+ import { Tooltip , TooltipContent , TooltipProvider , TooltipTrigger } from '@/components/ui/tooltip' ;
3815import { UserMenuContent } from '@/components/user-menu-content' ;
39- import { Icon } from '@/components/icon' ;
16+ import { useInitials } from '@/hooks/use-initials' ;
17+ import { cn } from '@/lib/utils' ;
18+ import { type BreadcrumbItem , type NavItem , type SharedData } from '@/types' ;
19+ import { Link , usePage } from '@inertiajs/react' ;
20+ import { BookOpenText , ChevronDown , FolderGit2 , LayoutGrid , Menu , Search } from 'lucide-react' ;
21+ import AppLogo from './app-logo' ;
22+ import AppLogoIcon from './app-logo-icon' ;
4023
4124const mainNavItems : NavItem [ ] = [
4225 {
@@ -59,7 +42,7 @@ const rightNavItems: NavItem[] = [
5942 } ,
6043] ;
6144
62- const activeItemStyles = " bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100" ;
45+ const activeItemStyles = ' bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100' ;
6346
6447interface AppHeaderProps {
6548 breadcrumbs ?: BreadcrumbItem [ ] ;
@@ -70,125 +53,128 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) {
7053 const getInitials = useInitials ( ) ;
7154 return (
7255 < >
73- < div className = "border-b border-sidebar-border/80 " >
74- < div className = "flex h-16 items-center px-4 md:max-w-7xl mx-auto " >
75- { /* Mobile Menu */ }
76- < div className = "lg:hidden" >
77- < Sheet >
78- < SheetTrigger asChild >
79- < Button variant = "ghost" size = "icon" className = "mr-2 w -[34px] h -[34px]" >
80- < Menu className = "h-5 w-5" />
81- </ Button >
82- </ SheetTrigger >
83- < SheetContent side = "left" className = "bg-neutral-50 h-full flex flex-col items-stretch justify-between w-64 " >
84- < SheetTitle className = "sr-only" > Navigation Menu</ SheetTitle >
85- < SheetHeader className = "text-left flex justify-start" >
86- < AppLogoIcon className = "h-6 w-6 fill-current text-black dark:text-white" />
87- </ SheetHeader >
88- < div className = "flex flex-col h-full space-y-4 mt-6 flex-1 " >
89- < div className = "flex flex-col text-sm h-full justify-between" >
90- < div className = "flex flex-col space-y-4" >
91- { mainNavItems . map ( ( item ) => (
92- < Link key = { item . title } href = { item . url } className = "flex items-center space-x-2 font-medium" >
93- { item . icon && < Icon iconNode = { item . icon } className = "h-5 w-5" /> }
94- < span > { item . title } </ span >
95- </ Link >
96- ) ) }
97- </ div >
56+ < div className = "border-b border-sidebar-border/80" >
57+ < div className = "mx-auto flex h-16 items-center px-4 md:max-w-7xl" >
58+ { /* Mobile Menu */ }
59+ < div className = "lg:hidden" >
60+ < Sheet >
61+ < SheetTrigger asChild >
62+ < Button variant = "ghost" size = "icon" className = "mr-2 h -[34px] w -[34px]" >
63+ < Menu className = "h-5 w-5" />
64+ </ Button >
65+ </ SheetTrigger >
66+ < SheetContent side = "left" className = "flex h-full w-64 flex-col items-stretch justify-between bg-neutral-50 " >
67+ < SheetTitle className = "sr-only" > Navigation Menu</ SheetTitle >
68+ < SheetHeader className = "flex justify-start text-left " >
69+ < AppLogoIcon className = "h-6 w-6 fill-current text-black dark:text-white" />
70+ </ SheetHeader >
71+ < div className = "mt-6 flex h-full flex-1 flex-col space-y-4 " >
72+ < div className = "flex h-full flex-col justify-between text-sm " >
73+ < div className = "flex flex-col space-y-4" >
74+ { mainNavItems . map ( ( item ) => (
75+ < Link key = { item . title } href = { item . url } className = "flex items-center space-x-2 font-medium" >
76+ { item . icon && < Icon iconNode = { item . icon } className = "h-5 w-5" /> }
77+ < span > { item . title } </ span >
78+ </ Link >
79+ ) ) }
80+ </ div >
9881
99- < div className = "flex flex-col space-y-4" >
100- { rightNavItems . map ( ( item ) => (
101- < a key = { item . title } href = { item . url } target = "_blank" rel = "noopener noreferrer" className = "flex items-center space-x-2 font-medium" >
102- { item . icon && < Icon iconNode = { item . icon } className = "h-5 w-5" /> }
103- < span > { item . title } </ span >
104- </ a >
105- ) ) }
82+ < div className = "flex flex-col space-y-4" >
83+ { rightNavItems . map ( ( item ) => (
84+ < a
85+ key = { item . title }
86+ href = { item . url }
87+ target = "_blank"
88+ rel = "noopener noreferrer"
89+ className = "flex items-center space-x-2 font-medium"
90+ >
91+ { item . icon && < Icon iconNode = { item . icon } className = "h-5 w-5" /> }
92+ < span > { item . title } </ span >
93+ </ a >
94+ ) ) }
95+ </ div >
10696 </ div >
10797 </ div >
108- </ div >
109- </ SheetContent >
110- </ Sheet >
111- </ div >
112-
113- < Link href = "/dashboard" prefetch className = "flex items-center space-x-2" >
114- < AppLogo />
115- </ Link >
98+ </ SheetContent >
99+ </ Sheet >
100+ </ div >
116101
117- { /* Desktop Navigation */ }
118- < div className = "hidden lg:flex items-center space-x-6 h-full ml-6" >
119- < NavigationMenu className = "h-full flex items-stretch " >
120- < NavigationMenuList className = "h-full space-x-2 flex items-stretch" >
102+ < Link href = "/dashboard" prefetch className = "flex items-center space-x-2" >
103+ < AppLogo />
104+ </ Link >
121105
122- { mainNavItems . map ( ( item , index ) => (
123- < NavigationMenuItem key = { index } className = "h-full flex items-center relative" >
124- < Link href = { item . url } >
125- < NavigationMenuLink className = { cn (
126- navigationMenuTriggerStyle ( ) ,
127- activeItemStyles ,
128- "px-3 h-9 cursor-pointer"
129- ) } >
130- { item . icon && < Icon iconNode = { item . icon } className = "mr-2 h-4 w-4" /> }
131- { item . title }
132- </ NavigationMenuLink >
133- </ Link >
134- < div className = "h-0.5 translate-y-px bg-black dark:bg-white w-full absolute bottom-0 left-0" > </ div >
135- </ NavigationMenuItem >
136- ) ) }
137- </ NavigationMenuList >
138- </ NavigationMenu >
139- </ div >
106+ { /* Desktop Navigation */ }
107+ < div className = "ml-6 hidden h-full items-center space-x-6 lg:flex" >
108+ < NavigationMenu className = "flex h-full items-stretch" >
109+ < NavigationMenuList className = "flex h-full items-stretch space-x-2" >
110+ { mainNavItems . map ( ( item , index ) => (
111+ < NavigationMenuItem key = { index } className = "relative flex h-full items-center" >
112+ < Link href = { item . url } >
113+ < NavigationMenuLink
114+ className = { cn ( navigationMenuTriggerStyle ( ) , activeItemStyles , 'h-9 cursor-pointer px-3' ) }
115+ >
116+ { item . icon && < Icon iconNode = { item . icon } className = "mr-2 h-4 w-4" /> }
117+ { item . title }
118+ </ NavigationMenuLink >
119+ </ Link >
120+ < div className = "absolute bottom-0 left-0 h-0.5 w-full translate-y-px bg-black dark:bg-white" > </ div >
121+ </ NavigationMenuItem >
122+ ) ) }
123+ </ NavigationMenuList >
124+ </ NavigationMenu >
125+ </ div >
140126
141- < div className = "ml-auto flex items-center space-x-2" >
142- < div className = "relative flex items-center space-x-1" >
143- < Button variant = "ghost" size = "icon" className = "w-9 h-9 cursor-pointer" >
144- < Search className = "h-5 w-5" />
145- </ Button >
146- < div className = "hidden lg:flex space-x-1" >
147- { rightNavItems . map ( ( item ) => (
148- < TooltipProvider delayDuration = { 0 } >
149- < Tooltip >
150- < TooltipTrigger >
151- < Button key = { item . title } variant = "ghost" size = "icon" asChild className = "w-9 h-9 cursor-pointer" >
152- < a href = { item . url } target = "_blank" rel = "noopener noreferrer" >
153- < span className = "sr-only" > { item . title } </ span >
154- { item . icon && < Icon iconNode = { item . icon } className = "h-5 w-5" /> }
155- </ a >
156- </ Button >
157- </ TooltipTrigger >
158- < TooltipContent >
159- < p > { item . title } </ p >
160- </ TooltipContent >
161- </ Tooltip >
162- </ TooltipProvider >
163- ) ) }
127+ < div className = "ml-auto flex items-center space-x-2" >
128+ < div className = "relative flex items-center space-x-1" >
129+ < Button variant = "ghost" size = "icon" className = "h-9 w-9 cursor-pointer" >
130+ < Search className = "h-5 w-5" />
131+ </ Button >
132+ < div className = "hidden space-x-1 lg:flex" >
133+ { rightNavItems . map ( ( item ) => (
134+ < TooltipProvider delayDuration = { 0 } >
135+ < Tooltip >
136+ < TooltipTrigger >
137+ < Button key = { item . title } variant = "ghost" size = "icon" asChild className = "h-9 w-9 cursor-pointer" >
138+ < a href = { item . url } target = "_blank" rel = "noopener noreferrer" >
139+ < span className = "sr-only" > { item . title } </ span >
140+ { item . icon && < Icon iconNode = { item . icon } className = "h-5 w-5" /> }
141+ </ a >
142+ </ Button >
143+ </ TooltipTrigger >
144+ < TooltipContent >
145+ < p > { item . title } </ p >
146+ </ TooltipContent >
147+ </ Tooltip >
148+ </ TooltipProvider >
149+ ) ) }
150+ </ div >
164151 </ div >
152+ < DropdownMenu >
153+ < DropdownMenuTrigger asChild >
154+ < Button variant = "ghost" className = "h-9 px-1.5" >
155+ < Avatar className = "h-7 w-7 overflow-hidden rounded-lg" >
156+ < AvatarImage src = { auth . user . avatar } alt = { auth . user . name } />
157+ < AvatarFallback className = "rounded-lg bg-neutral-200 text-black dark:bg-neutral-700 dark:text-white" >
158+ { getInitials ( auth . user . name ) }
159+ </ AvatarFallback >
160+ </ Avatar >
161+ < ChevronDown className = "hidden h-4 w-4 lg:block" />
162+ </ Button >
163+ </ DropdownMenuTrigger >
164+ < DropdownMenuContent className = "w-56" align = "end" >
165+ < UserMenuContent user = { auth . user } />
166+ </ DropdownMenuContent >
167+ </ DropdownMenu >
165168 </ div >
166- < DropdownMenu >
167- < DropdownMenuTrigger asChild >
168- < Button variant = "ghost" className = "h-9 px-1.5" >
169- < Avatar className = "h-7 w-7 overflow-hidden rounded-lg" >
170- < AvatarImage src = { auth . user . avatar } alt = { auth . user . name } />
171- < AvatarFallback className = "rounded-lg bg-neutral-200 text-black dark:bg-neutral-700 dark:text-white" >
172- { getInitials ( auth . user . name ) }
173- </ AvatarFallback >
174- </ Avatar >
175- < ChevronDown className = "h-4 w-4 hidden lg:block" />
176- </ Button >
177- </ DropdownMenuTrigger >
178- < DropdownMenuContent className = "w-56" align = "end" >
179- < UserMenuContent user = { auth . user } />
180- </ DropdownMenuContent >
181- </ DropdownMenu >
182169 </ div >
183170 </ div >
184- </ div >
185- { breadcrumbs . length > 1 && (
186- < div className = "w-full flex border-b border-sidebar-border/70 " >
187- < div className = "flex h-12 items-center justify-start w-full px-4 md:max-w-7xl mx-auto text-neutral-500" >
188- < Breadcrumbs breadcrumbs = { breadcrumbs } / >
171+ { breadcrumbs . length > 1 && (
172+ < div className = "flex w-full border-b border-sidebar-border/70" >
173+ < div className = "mx-auto flex h-12 w-full items-center justify-start px-4 text-neutral-500 md:max-w-7xl " >
174+ < Breadcrumbs breadcrumbs = { breadcrumbs } / >
175+ </ div >
189176 </ div >
190- </ div >
191- ) }
192- </ >
193- )
194- }
177+ ) }
178+ </ >
179+ ) ;
180+ }
0 commit comments