154 lines
4.7 KiB
TypeScript
154 lines
4.7 KiB
TypeScript
"use client";
|
|
|
|
import { useState, useEffect } from "react";
|
|
import Link from "next/link";
|
|
import { useRouter, usePathname } from "next/navigation";
|
|
import { Menu, X } from "lucide-react";
|
|
import { useLanguage } from "@/contexts/LanguageContext";
|
|
import LanguageSelector from "./LanguageSelector";
|
|
|
|
export default function Header() {
|
|
const { t } = useLanguage();
|
|
const router = useRouter();
|
|
const pathname = usePathname();
|
|
const [isScrolled, setIsScrolled] = useState(false);
|
|
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
|
|
|
|
const navItems = [
|
|
{ name: t("nav", "about"), href: "/#about" },
|
|
{ name: t("nav", "technology"), href: "/#technology" },
|
|
{ name: t("nav", "projects"), href: "/#projects" },
|
|
{ name: t("nav", "solutions"), href: "/#solutions" },
|
|
{ name: t("nav", "products"), href: "/#products" },
|
|
{ name: t("nav", "downloads"), href: "/downloads" },
|
|
{ name: t("nav", "contact"), href: "/#contact" },
|
|
];
|
|
|
|
useEffect(() => {
|
|
const handleScroll = () => {
|
|
setIsScrolled(window.scrollY > 50);
|
|
};
|
|
window.addEventListener("scroll", handleScroll);
|
|
return () => window.removeEventListener("scroll", handleScroll);
|
|
}, []);
|
|
|
|
// Handle hash scroll after navigation
|
|
useEffect(() => {
|
|
if (pathname === "/" && window.location.hash) {
|
|
const hash = window.location.hash.substring(1);
|
|
setTimeout(() => {
|
|
const element = document.getElementById(hash);
|
|
if (element) {
|
|
element.scrollIntoView({ behavior: "smooth" });
|
|
}
|
|
}, 100);
|
|
}
|
|
}, [pathname]);
|
|
|
|
const handleNavClick = (e: React.MouseEvent<HTMLAnchorElement>, href: string) => {
|
|
// If it's not a hash link, let it navigate normally
|
|
if (!href.includes("#")) {
|
|
return;
|
|
}
|
|
|
|
e.preventDefault();
|
|
const hash = href.split("#")[1];
|
|
|
|
if (pathname === "/") {
|
|
// Already on homepage, just scroll
|
|
const element = document.getElementById(hash);
|
|
if (element) {
|
|
element.scrollIntoView({ behavior: "smooth" });
|
|
}
|
|
} else {
|
|
// Navigate to homepage first, then scroll
|
|
router.push(href);
|
|
}
|
|
|
|
setIsMobileMenuOpen(false);
|
|
};
|
|
|
|
return (
|
|
<header
|
|
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
|
|
isScrolled
|
|
? "bg-white/95 backdrop-blur-sm shadow-md"
|
|
: "bg-transparent"
|
|
}`}
|
|
>
|
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
<div className="flex items-center justify-between h-16 md:h-20">
|
|
{/* Logo */}
|
|
<Link href="/" className="flex items-center space-x-2">
|
|
<span
|
|
className={`text-2xl font-bold transition-colors ${
|
|
isScrolled ? "text-[#1E3A8A]" : "text-white"
|
|
}`}
|
|
>
|
|
GRANTECH
|
|
</span>
|
|
</Link>
|
|
|
|
{/* Desktop Navigation */}
|
|
<nav className="hidden md:flex items-center space-x-6">
|
|
{navItems.map((item) => (
|
|
<a
|
|
key={item.href}
|
|
href={item.href}
|
|
onClick={(e) => handleNavClick(e, item.href)}
|
|
className={`text-sm font-medium transition-colors hover:text-[#3B82F6] ${
|
|
isScrolled ? "text-gray-700" : "text-white"
|
|
}`}
|
|
>
|
|
{item.name}
|
|
</a>
|
|
))}
|
|
<LanguageSelector isScrolled={isScrolled} />
|
|
</nav>
|
|
|
|
{/* Mobile Menu Button */}
|
|
<div className="flex items-center md:hidden space-x-2">
|
|
<LanguageSelector isScrolled={isScrolled} />
|
|
<button
|
|
className="p-2"
|
|
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
|
|
>
|
|
{isMobileMenuOpen ? (
|
|
<X
|
|
className={`w-6 h-6 ${
|
|
isScrolled ? "text-gray-700" : "text-white"
|
|
}`}
|
|
/>
|
|
) : (
|
|
<Menu
|
|
className={`w-6 h-6 ${
|
|
isScrolled ? "text-gray-700" : "text-white"
|
|
}`}
|
|
/>
|
|
)}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Mobile Menu */}
|
|
{isMobileMenuOpen && (
|
|
<div className="md:hidden bg-white border-t">
|
|
<nav className="py-4 space-y-2">
|
|
{navItems.map((item) => (
|
|
<a
|
|
key={item.href}
|
|
href={item.href}
|
|
onClick={(e) => handleNavClick(e, item.href)}
|
|
className="block px-4 py-2 text-gray-700 hover:bg-gray-50 hover:text-[#3B82F6]"
|
|
>
|
|
{item.name}
|
|
</a>
|
|
))}
|
|
</nav>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</header>
|
|
);
|
|
}
|