top-nav.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { cn } from '@/lib/utils'
  2. import { Link } from 'react-router-dom'
  3. import {
  4. DropdownMenu,
  5. DropdownMenuContent,
  6. DropdownMenuItem,
  7. DropdownMenuTrigger,
  8. } from '@/components/ui/dropdown-menu'
  9. import { Button } from './custom/button'
  10. import { IconMenu } from '@tabler/icons-react'
  11. import { useTranslations } from 'use-intl'
  12. interface TopNavProps extends React.HTMLAttributes<HTMLElement> {
  13. links: {
  14. title: string
  15. href: string
  16. isActive: boolean
  17. }[]
  18. }
  19. export function TopNav({ className, links, ...props }: TopNavProps) {
  20. const t = useTranslations()
  21. return (
  22. <>
  23. <div className='md:hidden'>
  24. <DropdownMenu>
  25. <DropdownMenuTrigger asChild>
  26. <Button size='icon' variant='outline'>
  27. <IconMenu />
  28. </Button>
  29. </DropdownMenuTrigger>
  30. <DropdownMenuContent side='bottom' align='start'>
  31. {links.map(({ title, href, isActive }) => (
  32. <DropdownMenuItem key={`${title}-${href}`} asChild>
  33. <Link
  34. to={href}
  35. className={!isActive ? 'text-muted-foreground' : ''}
  36. >
  37. {t(title)}
  38. </Link>
  39. </DropdownMenuItem>
  40. ))}
  41. </DropdownMenuContent>
  42. </DropdownMenu>
  43. </div>
  44. <nav
  45. className={cn(
  46. 'hidden items-center space-x-4 md:flex lg:space-x-6',
  47. className
  48. )}
  49. {...props}
  50. >
  51. {links.map(({ title, href, isActive }) => (
  52. <Link
  53. key={`${title}-${href}`}
  54. to={href}
  55. className={`text-sm font-medium transition-colors hover:text-primary ${isActive ? '' : 'text-muted-foreground'}`}
  56. >
  57. {t(title)}
  58. </Link>
  59. ))}
  60. </nav>
  61. </>
  62. )
  63. }