@@ -10,75 +10,95 @@ import { QuestionCircle } from '@primeicons/react/question-circle';
1010import { Star } from '@primeicons/react/star' ;
1111import { useMenu } from '@primereact/headless/menu' ;
1212import { useMenuSub } from '@primereact/headless/menu/sub' ;
13- import * as React from 'react' ;
14-
15- const itemClass =
16- 'flex items-center gap-2 px-3 py-2 rounded-md text-sm cursor-pointer transition-colors text-surface-700 dark:text-surface-200 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed' ;
17-
18- function SubMenu ( { menu, icon, label } : { menu : ReturnType < typeof useMenu > ; icon : React . ReactNode ; label : string } ) {
19- const sub = useMenuSub ( { defaultOpen : true } ) ;
20- const { subProps, subtriggerProps, listProps, state } = sub ;
21- const { getSubTriggerProps, getItemProps, getListProps } = menu ;
22-
23- return (
24- < li { ...subProps } >
25- < div { ...subtriggerProps } { ...getSubTriggerProps ( { value : 'projects' , sub } ) } className = { itemClass } >
26- { icon }
27- < span className = "flex-1" > { label } </ span >
28- < ChevronDown className = { `w-3.5 h-3.5 transition-transform duration-200 ${ state . open ? 'rotate-180' : '' } ` } />
29- </ div >
30- < ul { ...listProps } { ...getListProps ( { value : 'projects' , sub } ) } className = "pl-4 list-none m-0 p-0 outline-none" >
31- < li { ...getItemProps ( { value : 'active-projects' } ) } className = { itemClass } >
32- < Briefcase className = "w-4 h-4" />
33- Active Projects
34- </ li >
35- < li { ...getItemProps ( { value : 'recent' } ) } className = { itemClass } >
36- < Clock className = "w-4 h-4" />
37- Recent
38- </ li >
39- < li { ...getItemProps ( { value : 'favorites' } ) } className = { itemClass } >
40- < Star className = "w-4 h-4" />
41- Favorites
42- </ li >
43- < li { ...getItemProps ( { value : 'completed' } ) } className = { itemClass } >
44- < CheckCircle className = "w-4 h-4" />
45- Completed
46- </ li >
47- </ ul >
48- </ li >
49- ) ;
50- }
5113
5214export default function BasicDemo ( ) {
5315 const menu = useMenu ( ) ;
54- const { rootProps, getListProps, getItemProps, separatorProps, labelProps } = menu ;
16+ const { rootProps, getListProps, getItemProps, labelProps, separatorProps } = menu ;
17+ const projectsSub = useMenuSub ( { defaultOpen : true } ) ;
18+ const projectsSubTriggerProps = menu . getSubTriggerProps ( { value : 'projects' , sub : projectsSub } ) ;
5519
5620 return (
5721 < div className = "flex justify-center" >
58- < div { ...rootProps } className = "w-64 border border-surface-200 dark:border-surface-700 rounded-lg p-1" >
59- < ul { ...getListProps ( ) } className = "list-none m-0 p-0 outline-none" >
60- < li { ...getItemProps ( { value : 'dashboard' } ) } className = { itemClass } >
61- < Home className = "w-4 h-4" />
22+ < div
23+ { ...rootProps }
24+ className = "w-64 border border-surface-200 rounded-lg bg-surface-0 dark:bg-surface-900 dark:border-surface-700 overflow-hidden"
25+ >
26+ < ul { ...getListProps ( ) } className = "list-none m-0 p-1 flex flex-col gap-0.5 outline-none" >
27+ < li
28+ { ...getItemProps ( { value : 'dashboard' } ) }
29+ className = "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-surface-700 dark:text-surface-200 hover:bg-surface-50 dark:hover:bg-surface-800 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 text-sm select-none"
30+ >
31+ < Home className = "w-4! h-4! text-surface-500" />
6232 Dashboard
6333 </ li >
6434
6535 < li { ...separatorProps } className = "border-t border-surface-200 dark:border-surface-700 my-1" />
6636
67- < li { ...labelProps } className = "px-3 py-1.5 text-xs font-semibold text-surface-500 dark:text-surface-400 uppercase tracking-wider " >
37+ < li { ...labelProps } className = "px-3 py-1.5 text-xs font-semibold text-surface-500 uppercase tracking-wide " >
6838 Workspace
6939 </ li >
7040
71- < li { ...getItemProps ( { value : 'analytics' } ) } className = { itemClass } >
72- < ChartLine className = "w-4 h-4" />
41+ < li
42+ { ...getItemProps ( { value : 'analytics' } ) }
43+ className = "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-surface-700 dark:text-surface-200 hover:bg-surface-50 dark:hover:bg-surface-800 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 text-sm select-none"
44+ >
45+ < ChartLine className = "w-4! h-4! text-surface-500" />
7346 Analytics
7447 </ li >
7548
76- < SubMenu menu = { menu } label = "Projects" icon = { < Folder className = "w-4 h-4" /> } />
49+ < li { ...projectsSub . subProps } >
50+ < div
51+ { ...projectsSubTriggerProps }
52+ className = "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-surface-700 dark:text-surface-200 hover:bg-surface-50 dark:hover:bg-surface-800 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 text-sm select-none"
53+ >
54+ < Folder className = "w-4! h-4! text-surface-500" />
55+ Projects
56+ < span
57+ className = "ml-auto transition-transform duration-200"
58+ style = { { transform : projectsSub . state . open ? 'rotate(180deg)' : 'rotate(0deg)' } }
59+ >
60+ < ChevronDown className = "w-3.5 h-3.5 text-surface-400" />
61+ </ span >
62+ </ div >
63+ < ul { ...menu . getListProps ( { value : 'projects' , sub : projectsSub } ) } className = "list-none m-0 p-0 pl-4" >
64+ < li
65+ { ...getItemProps ( { value : 'active-projects' } ) }
66+ className = "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-surface-700 dark:text-surface-200 hover:bg-surface-50 dark:hover:bg-surface-800 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 text-sm select-none"
67+ >
68+ < Briefcase className = "w-4! h-4! text-surface-500" />
69+ Active Projects
70+ </ li >
71+ < li
72+ { ...getItemProps ( { value : 'recent' } ) }
73+ className = "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-surface-700 dark:text-surface-200 hover:bg-surface-50 dark:hover:bg-surface-800 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 text-sm select-none"
74+ >
75+ < Clock className = "w-4! h-4! text-surface-500" />
76+ Recent
77+ </ li >
78+ < li
79+ { ...getItemProps ( { value : 'favorites' } ) }
80+ className = "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-surface-700 dark:text-surface-200 hover:bg-surface-50 dark:hover:bg-surface-800 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 text-sm select-none"
81+ >
82+ < Star className = "w-4! h-4! text-surface-500" />
83+ Favorites
84+ </ li >
85+ < li
86+ { ...getItemProps ( { value : 'completed' } ) }
87+ className = "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-surface-700 dark:text-surface-200 hover:bg-surface-50 dark:hover:bg-surface-800 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 text-sm select-none"
88+ >
89+ < CheckCircle className = "w-4! h-4! text-surface-500" />
90+ Completed
91+ </ li >
92+ </ ul >
93+ </ li >
7794
7895 < li { ...separatorProps } className = "border-t border-surface-200 dark:border-surface-700 my-1" />
7996
80- < li { ...getItemProps ( { value : 'help' } ) } className = { itemClass } >
81- < QuestionCircle className = "w-4 h-4" />
97+ < li
98+ { ...getItemProps ( { value : 'help' } ) }
99+ className = "flex items-center gap-2 px-3 py-2 rounded-md cursor-pointer text-surface-700 dark:text-surface-200 hover:bg-surface-50 dark:hover:bg-surface-800 data-[focused]:bg-surface-100 dark:data-[focused]:bg-surface-700 text-sm select-none"
100+ >
101+ < QuestionCircle className = "w-4! h-4! text-surface-500" />
82102 Help & Support
83103 </ li >
84104 </ ul >
0 commit comments