computer-scienceangular-roadmapbackend-roadmapblockchain-roadmapdba-roadmapdeveloper-roadmapdevops-roadmapfrontend-roadmapgo-roadmaphactoberfestjava-roadmapjavascript-roadmapnodejs-roadmappython-roadmapqa-roadmapreact-roadmaproadmapstudy-planvue-roadmapweb3-roadmap
64 lines
1.5 KiB
64 lines
1.5 KiB
import { useEffect, useState, type ReactNode } from 'react'; |
|
import { cn } from '../../lib/classname'; |
|
import { HeroTitle } from './HeroTitle'; |
|
|
|
type HeroItemsGroupProps = { |
|
icon: any; |
|
isLoading?: boolean; |
|
title: string | ReactNode; |
|
rightContent?: ReactNode; |
|
isAllCollapsed?: boolean; |
|
children?: ReactNode; |
|
className?: string; |
|
}; |
|
|
|
export function HeroItemsGroup(props: HeroItemsGroupProps) { |
|
const { |
|
icon, |
|
isLoading = false, |
|
title, |
|
rightContent, |
|
isAllCollapsed = false, |
|
children, |
|
className, |
|
} = props; |
|
|
|
const [isCollapsed, setIsCollapsed] = useState(isLoading || isAllCollapsed); |
|
|
|
useEffect(() => { |
|
setIsCollapsed(isAllCollapsed || isLoading); |
|
}, [isAllCollapsed, isLoading]); |
|
|
|
return ( |
|
<div |
|
className={cn( |
|
'border-b border-gray-800/50', |
|
{ |
|
'py-4': !isCollapsed, |
|
'py-3': isCollapsed, |
|
'opacity-50 transition-opacity hover:opacity-100': |
|
isCollapsed && !isLoading, |
|
}, |
|
className, |
|
)} |
|
> |
|
<div className="container"> |
|
<HeroTitle |
|
icon={icon} |
|
isLoading={isLoading} |
|
title={title} |
|
rightContent={rightContent} |
|
isCollapsed={isCollapsed} |
|
onToggleCollapse={() => { |
|
setIsCollapsed(!isCollapsed); |
|
}} |
|
/> |
|
{!isCollapsed && ( |
|
<div className="mt-4 grid grid-cols-1 gap-2.5 sm:grid-cols-2 md:grid-cols-3"> |
|
{children} |
|
</div> |
|
)} |
|
</div> |
|
</div> |
|
); |
|
}
|
|
|