deepsite / src /components /Header.astro
archjayte's picture
Upload 35 files
afa9e42 verified
raw
history blame
5.05 kB
---
import { getLangFromUrl, useTranslations } from '../i18n/ui';
import LanguageSelector from './LanguageSelector.astro';
import ThemeToggle from './ThemeToggle.astro';
import { Menu, X } from 'lucide-astro';
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
---
<header class="fixed top-0 left-0 right-0 z-50 transition-all duration-300" data-header>
<nav class="container-custom">
<div class="flex items-center justify-between h-20 px-4 transition-all duration-300" data-nav-container>
<!-- Logo -->
<a href={lang === 'ar' ? '/' : `/${lang}`} class="flex items-center">
<img
src="/logo.jpg"
alt="Blueprint Engineering Consultancy Logo"
class="h-14 w-auto transition-all duration-300"
data-logo
/>
</a>
<!-- Desktop Navigation -->
<div class="hidden lg:flex items-center space-x-8 rtl:space-x-reverse">
<a href="#about" class="nav-link">{t('nav.about')}</a>
<a href="#services" class="nav-link">{t('nav.services')}</a>
<a href="#workflow" class="nav-link">{t('nav.workflow')}</a>
<a href="#contact" class="nav-link">{t('nav.contact')}</a>
</div>
<!-- Language Selector & Theme Toggle -->
<div class="flex items-center space-x-4 rtl:space-x-reverse">
<ThemeToggle />
<LanguageSelector />
<!-- Mobile Menu Button -->
<button class="lg:hidden text-white p-2" data-mobile-menu-toggle>
<Menu class="w-6 h-6" data-menu-icon />
<X class="w-6 h-6 hidden" data-close-icon />
</button>
</div>
</div>
<!-- Mobile Navigation -->
<div class="lg:hidden hidden bg-blueprint-primary/95 backdrop-blur-md border-t border-blueprint-accent/20" data-mobile-menu>
<div class="px-4 py-4 space-y-4">
<a href="#about" class="block nav-link">{t('nav.about')}</a>
<a href="#services" class="block nav-link">{t('nav.services')}</a>
<a href="#workflow" class="block nav-link">{t('nav.workflow')}</a>
<a href="#contact" class="block nav-link">{t('nav.contact')}</a>
</div>
</div>
</nav>
</header>
<script>
// Mobile menu toggle
const mobileMenuToggle = document.querySelector('[data-mobile-menu-toggle]');
const mobileMenu = document.querySelector('[data-mobile-menu]');
const menuIcon = document.querySelector('[data-menu-icon]');
const closeIcon = document.querySelector('[data-close-icon]');
mobileMenuToggle?.addEventListener('click', () => {
mobileMenu?.classList.toggle('hidden');
menuIcon?.classList.toggle('hidden');
closeIcon?.classList.toggle('hidden');
});
// Header scroll effects
let lastScrollTop = 0;
const header = document.querySelector('[data-header]') as HTMLElement;
const navContainer = document.querySelector('[data-nav-container]') as HTMLElement;
const logo = document.querySelector('[data-logo]') as HTMLElement;
function updateHeader() {
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
if (scrollTop > 50) {
// Scrolled state
header.classList.add('bg-blueprint-primary/95', 'backdrop-blur-md', 'border-b', 'border-blueprint-accent/20', 'shadow-lg');
navContainer.classList.add('h-16');
navContainer.classList.remove('h-20');
logo.classList.add('h-10');
logo.classList.remove('h-14');
} else {
// Top state
header.classList.remove('bg-blueprint-primary/95', 'backdrop-blur-md', 'border-b', 'border-blueprint-accent/20', 'shadow-lg');
navContainer.classList.remove('h-16');
navContainer.classList.add('h-20');
logo.classList.remove('h-10');
logo.classList.add('h-14');
}
// Hide/show header on scroll
if (scrollTop > lastScrollTop && scrollTop > 100) {
// Scrolling down
header.style.transform = 'translateY(-100%)';
} else {
// Scrolling up
header.style.transform = 'translateY(0)';
}
lastScrollTop = scrollTop <= 0 ? 0 : scrollTop;
}
window.addEventListener('scroll', updateHeader);
// Initial call
updateHeader();
// Smooth scroll for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
const headerHeight = header?.offsetHeight || 0;
const targetPosition = target.offsetTop - headerHeight - 20;
window.scrollTo({
top: targetPosition,
behavior: 'smooth'
});
// Close mobile menu if open
mobileMenu?.classList.add('hidden');
menuIcon?.classList.remove('hidden');
closeIcon?.classList.add('hidden');
}
});
});
</script>
<style>
.nav-link {
@apply text-white hover:text-blueprint-accent transition-colors duration-300 font-medium;
}
.nav-link:hover {
@apply text-blueprint-accent;
}
</style>