'use client';
import * as React from 'react';
import { TransitionLink } from '@/components/ui/TransitionLink';
import Image from 'next/image';
import { usePathname } from 'next/navigation';
import { motion, useScroll, useTransform, AnimatePresence } from 'framer-motion';
import { LanguageSwitcher } from './LanguageSwitcher';
export interface NavLink {
label: string;
url: string;
children?: NavLink[];
}
interface HeaderProps {
navLinks: NavLink[];
}
export function Header({ navLinks }: HeaderProps) {
const [isScrolled, setIsScrolled] = React.useState(false);
const [forceSolid, setForceSolid] = React.useState(false);
const [headerVariant, setHeaderVariant] = React.useState<'capsule' | 'standard'>('capsule');
const pathname = usePathname() || '/';
// Scroll bound shine effect (continuous looping as user scrolls)
const { scrollY } = useScroll();
const shineX = useTransform(scrollY, (y) => {
const adjustedY = Math.max(0, y - 20); // Start after the solid mode kicks in
const range = 800; // 1 full sweep per 800px scrolled
const progress = (adjustedY % range) / range;
return `${-150 + progress * 300}%`;
});
// Determine current locale from pathname
const currentLocale = pathname.startsWith('/en') ? 'en' : 'de';
React.useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 20);
};
window.addEventListener('scroll', handleScroll);
// Check for forced solid header (used by error pages, legal pages without hero, etc.)
const checkHeaderState = () => {
setForceSolid(document.body.getAttribute('data-force-solid-header') === 'true');
setHeaderVariant((document.body.getAttribute('data-header-variant') as 'capsule' | 'standard') || 'capsule');
};
checkHeaderState();
// Set up observer for client-side navigation changes
const observer = new MutationObserver(checkHeaderState);
observer.observe(document.body, { attributes: true, attributeFilter: ['data-force-solid-header', 'data-header-variant'] });
// Re-check when pathname changes
checkHeaderState();
return () => {
window.removeEventListener('scroll', handleScroll);
observer.disconnect();
};
}, [pathname]);
const isSolidMode = isScrolled || forceSolid || headerVariant === 'standard';
const isStandard = headerVariant === 'standard';
return (
<>