Navbar.jsx 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { Link } from 'react-router-dom';
  2. import { useState, useRef, useEffect } from 'react';
  3. import { useLanguage } from '../context/LanguageContext';
  4. function Navbar() {
  5. const [isOpen, setIsOpen] = useState(false);
  6. const dropdownRef = useRef(null);
  7. const { language, setLanguage, t } = useLanguage();
  8. // Close dropdown when clicking outside
  9. useEffect(() => {
  10. function handleClickOutside(event) {
  11. if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
  12. setIsOpen(false);
  13. }
  14. }
  15. document.addEventListener('mousedown', handleClickOutside);
  16. return () => {
  17. document.removeEventListener('mousedown', handleClickOutside);
  18. };
  19. }, []);
  20. return (
  21. <nav className="fixed w-full bg-white z-50 top-0 py-6">
  22. <div className="max-w-[1400px] mx-auto px-4 sm:px-6 lg:px-8">
  23. <div className="flex justify-between items-center">
  24. <Link to="/" className="text-xl font-medium">
  25. byom
  26. </Link>
  27. {/* Contact dropdown */}
  28. <div className="absolute left-1/2 -translate-x-1/2" ref={dropdownRef}>
  29. <button
  30. onClick={() => setIsOpen(!isOpen)}
  31. className="bg-black text-white rounded-full w-auto h-6 text-xs flex items-center justify-center px-4 hover:bg-brand-purple transition-colors"
  32. >
  33. {t('nav.contact')}
  34. </button>
  35. {/* Dropdown menu */}
  36. {isOpen && (
  37. <div className="absolute top-full left-1/2 -translate-x-1/2 mt-2 w-48 bg-white rounded-2xl shadow-lg ring-1 ring-black/5 p-4 transform opacity-100 scale-100 transition-all">
  38. <div className="space-y-3">
  39. <div className="text-xs text-gray-500 uppercase">
  40. {t('nav.getInTouch')}
  41. </div>
  42. <a
  43. href="mailto:hello@byom.fr"
  44. className="flex items-center gap-2 text-sm text-gray-900 hover:text-brand-purple transition-colors"
  45. >
  46. <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
  47. <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
  48. </svg>
  49. hello@byom.fr
  50. </a>
  51. </div>
  52. </div>
  53. )}
  54. </div>
  55. <div className="flex items-center gap-6">
  56. {/* Language switcher */}
  57. <button
  58. onClick={() => setLanguage(language === 'en' ? 'fr' : 'en')}
  59. className="text-sm text-gray-500 hover:text-brand-purple transition-colors"
  60. >
  61. {language.toUpperCase()}
  62. </button>
  63. <Link to="/pricing" className="text-sm">
  64. {t('nav.pricing')}
  65. </Link>
  66. <Link to="/login" className="bg-black text-white rounded-full px-6 py-2 text-sm flex items-center gap-2">
  67. <span>{t('nav.login')}</span>
  68. <span>→</span>
  69. </Link>
  70. </div>
  71. </div>
  72. </div>
  73. </nav>
  74. );
  75. }
  76. export default Navbar;