© {new Date().getFullYear()} E-TIB GmbH. {locale === 'de' ? 'Alle Rechte vorbehalten.' : 'All rights reserved.'}
@@ -143,7 +143,7 @@ export function Footer({ companyInfo }: FooterProps) {
{/* Quality Badges */}
-
+
SSL Secured
Green Hosting
DSGVO Compliant
diff --git a/components/layout/Header.tsx b/components/layout/Header.tsx
index 82708eced..f64d90eea 100644
--- a/components/layout/Header.tsx
+++ b/components/layout/Header.tsx
@@ -1,13 +1,11 @@
'use client';
import * as React from 'react';
-import Link from 'next/link';
import { TransitionLink } from '@/components/ui/TransitionLink';
import Image from 'next/image';
import { usePathname } from 'next/navigation';
-import { motion, AnimatePresence, useScroll, useTransform } from 'framer-motion';
+import { motion, useScroll, useTransform } from 'framer-motion';
import { LanguageSwitcher } from './LanguageSwitcher';
-import { Button } from '@/components/ui/Button';
export interface NavLink {
label: string;
@@ -20,7 +18,6 @@ interface HeaderProps {
export function Header({ navLinks }: HeaderProps) {
const [isScrolled, setIsScrolled] = React.useState(false);
- const [isMobileMenuOpen, setIsMobileMenuOpen] = React.useState(false);
const [forceSolid, setForceSolid] = React.useState(false);
const pathname = usePathname() || '/';
@@ -36,13 +33,6 @@ export function Header({ navLinks }: HeaderProps) {
// Determine current locale from pathname
const currentLocale = pathname.startsWith('/en') ? 'en' : 'de';
- // Helper to switch languages
- const getSwitchedUrl = (newLocale: string) => {
- if (!pathname) return `/${newLocale}`;
- const pathWithoutLocale = pathname.replace(/^\/(en|de)/, '');
- return `/${newLocale}${pathWithoutLocale === '' ? '' : pathWithoutLocale}`;
- };
-
React.useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 20);
@@ -68,10 +58,7 @@ export function Header({ navLinks }: HeaderProps) {
};
}, [pathname]);
- // Close mobile menu on route change
- React.useEffect(() => {
- setIsMobileMenuOpen(false);
- }, [pathname]);
+ // Check for force solid initially
const isSolidMode = isScrolled || forceSolid;
@@ -98,9 +85,9 @@ export function Header({ navLinks }: HeaderProps) {
/>
-
+
-
-
- {/* Mobile Menu Overlay */}
-
- {isMobileMenuOpen && (
-
-
- {navLinks && navLinks.length > 0 && navLinks.map((link) => {
- const mappedUrl = link.url.startsWith('/') && !link.url.match(/^\/(en|de)/)
- ? `/${currentLocale}${link.url}`
- : link.url;
-
- return (
- setIsMobileMenuOpen(false)}
- >
- {link.label}
-
- );
- })}
-
- setIsMobileMenuOpen(false)}
- >
- {currentLocale === 'de' ? 'Kontakt' : 'Contact'}
-
-
-
-
-
- )}
-
>
);
}
diff --git a/components/layout/MobileBottomNav.tsx b/components/layout/MobileBottomNav.tsx
new file mode 100644
index 000000000..d136056e2
--- /dev/null
+++ b/components/layout/MobileBottomNav.tsx
@@ -0,0 +1,101 @@
+'use client';
+
+import * as React from 'react';
+import { usePathname } from 'next/navigation';
+import { TransitionLink } from '@/components/ui/TransitionLink';
+import { Home, Briefcase, Users, Mail } from 'lucide-react';
+import { motion } from 'framer-motion';
+
+export interface NavLink {
+ label: string;
+ url: string;
+}
+
+interface MobileBottomNavProps {
+ navLinks: NavLink[];
+ currentLocale: string;
+}
+
+export function MobileBottomNav({ navLinks, currentLocale }: MobileBottomNavProps) {
+ const pathname = usePathname() || '/';
+
+ // Construct our bottom nav items based on the passed links
+ const items = React.useMemo(() => {
+ const homeUrl = `/${currentLocale}`;
+
+ // Find the specific links from the provided navLinks (which might be translated)
+ // We do a simple match based on index or keywords if needed, but since we know the order:
+ // 0: Kompetenzen, 1: Über uns, 2: Karriere, 3: Messen
+ const competenciesUrl = navLinks[0]?.url || `/${currentLocale}/kompetenzen`;
+ const aboutUrl = navLinks[1]?.url || `/${currentLocale}/ueber-uns`;
+ const contactUrl = `/${currentLocale}/${currentLocale === 'de' ? 'kontakt' : 'contact'}`;
+
+ return [
+ {
+ label: currentLocale === 'de' ? 'Start' : 'Home',
+ url: homeUrl,
+ icon:
,
+ exactMatch: true
+ },
+ {
+ label: navLinks[0]?.label || (currentLocale === 'de' ? 'Kompetenzen' : 'Competencies'),
+ url: competenciesUrl,
+ icon:
+ },
+ {
+ label: navLinks[1]?.label || (currentLocale === 'de' ? 'Über uns' : 'About Us'),
+ url: aboutUrl,
+ icon:
+ },
+ {
+ label: currentLocale === 'de' ? 'Kontakt' : 'Contact',
+ url: contactUrl,
+ icon:
+ }
+ ];
+ }, [currentLocale, navLinks]);
+
+ return (
+
+
+ {items.map((item) => {
+ // Determine if active
+ const mappedUrl = item.url.startsWith('/') && !item.url.match(/^\/(en|de)/)
+ ? `/${currentLocale}${item.url}`
+ : item.url;
+
+ const isActive = item.exactMatch
+ ? pathname === mappedUrl
+ : (pathname === mappedUrl || (mappedUrl !== `/${currentLocale}` && pathname?.startsWith(`${mappedUrl}/`)));
+
+ return (
+
+
+ {/* Active Icon Background */}
+ {isActive && (
+
+ )}
+
+ {/* Icon wrapper to ensure it sits above the background */}
+
+ {item.icon}
+
+
+ {item.label}
+
+ );
+ })}
+
+
+ );
+}