@@ -11,8 +11,10 @@ import {
1111 SidebarMenuItem ,
1212 SidebarMenuSub ,
1313 SidebarMenuSubButton ,
14- SidebarMenuSubItem
14+ SidebarMenuSubItem ,
15+ useSidebar
1516} from '@/components/ui/sidebar' ;
17+ import { SidebarHoverMenu } from '@/components/ui/sidebar-hover-menu' ;
1618import Link from 'next/link' ;
1719import { useCollapsibleState } from '@/hooks/use-collapsible-state' ;
1820
@@ -32,6 +34,7 @@ interface NavMainProps {
3234export function NavMain ( { items, onItemClick } : NavMainProps ) {
3335 const router = useRouter ( ) ;
3436 const { isItemCollapsed, toggleItem } = useCollapsibleState ( ) ;
37+ const { state } = useSidebar ( ) ;
3538
3639 const handleClick = ( url : string ) => {
3740 onItemClick ?.( url ) ;
@@ -41,46 +44,68 @@ export function NavMain({ items, onItemClick }: NavMainProps) {
4144 return (
4245 < SidebarGroup >
4346 < SidebarMenu >
44- { items . map ( ( item ) => (
45- < Collapsible
46- key = { item . title }
47- asChild
48- open = { ! isItemCollapsed ( item . title ) }
49- onOpenChange = { ( ) => toggleItem ( item . title ) }
50- className = "group/collapsible"
51- >
52- < SidebarMenuItem >
53- < CollapsibleTrigger asChild >
54- < SidebarMenuButton
55- className = "cursor-pointer"
56- tooltip = { item . title }
57- onClick = { ( ) => handleClick ( item . url ) }
58- >
59- { item . icon && < item . icon /> }
60- < span > { item . title } </ span >
61- { ( item . items ?. length || 0 ) > 0 && (
62- < ChevronRight className = "ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90" />
63- ) }
64- </ SidebarMenuButton >
65- </ CollapsibleTrigger >
66- { ( item . items ?. length || 0 ) > 0 && (
67- < CollapsibleContent >
68- < SidebarMenuSub >
69- { item . items ?. map ( ( subItem ) => (
70- < SidebarMenuSubItem key = { subItem . title } >
71- < SidebarMenuSubButton asChild >
72- < Link href = { subItem . url } >
73- < span > { subItem . title } </ span >
74- </ Link >
75- </ SidebarMenuSubButton >
76- </ SidebarMenuSubItem >
77- ) ) }
78- </ SidebarMenuSub >
79- </ CollapsibleContent >
80- ) }
81- </ SidebarMenuItem >
82- </ Collapsible >
83- ) ) }
47+ { items . map ( ( item ) => {
48+ const hasNestedItems = ( item . items ?. length || 0 ) > 0 ;
49+ const isCollapsed = state === 'collapsed' ;
50+
51+ if ( hasNestedItems && isCollapsed ) {
52+ return (
53+ < SidebarMenuItem key = { item . title } >
54+ < SidebarHoverMenu items = { item . items || [ ] } >
55+ < SidebarMenuButton
56+ className = "cursor-pointer"
57+ tooltip = { item . title }
58+ onClick = { ( ) => handleClick ( item . url ) }
59+ >
60+ { item . icon && < item . icon /> }
61+ < span > { item . title } </ span >
62+ </ SidebarMenuButton >
63+ </ SidebarHoverMenu >
64+ </ SidebarMenuItem >
65+ ) ;
66+ }
67+
68+ return (
69+ < Collapsible
70+ key = { item . title }
71+ asChild
72+ open = { ! isItemCollapsed ( item . title ) }
73+ onOpenChange = { ( ) => toggleItem ( item . title ) }
74+ className = "group/collapsible"
75+ >
76+ < SidebarMenuItem >
77+ < CollapsibleTrigger asChild >
78+ < SidebarMenuButton
79+ className = "cursor-pointer"
80+ tooltip = { item . title }
81+ onClick = { ( ) => handleClick ( item . url ) }
82+ >
83+ { item . icon && < item . icon /> }
84+ < span > { item . title } </ span >
85+ { hasNestedItems && (
86+ < ChevronRight className = "ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90" />
87+ ) }
88+ </ SidebarMenuButton >
89+ </ CollapsibleTrigger >
90+ { hasNestedItems && (
91+ < CollapsibleContent >
92+ < SidebarMenuSub >
93+ { item . items ?. map ( ( subItem ) => (
94+ < SidebarMenuSubItem key = { subItem . title } >
95+ < SidebarMenuSubButton asChild >
96+ < Link href = { subItem . url } >
97+ < span > { subItem . title } </ span >
98+ </ Link >
99+ </ SidebarMenuSubButton >
100+ </ SidebarMenuSubItem >
101+ ) ) }
102+ </ SidebarMenuSub >
103+ </ CollapsibleContent >
104+ ) }
105+ </ SidebarMenuItem >
106+ </ Collapsible >
107+ ) ;
108+ } ) }
84109 </ SidebarMenu >
85110 </ SidebarGroup >
86111 ) ;
0 commit comments