Spaces:
Running
Running
| // Mobile menu toggle | |
| document.addEventListener('DOMContentLoaded', function() { | |
| const mobileMenuToggle = document.querySelector('.mobile-menu-toggle'); | |
| const navMenu = document.querySelector('.nav-menu'); | |
| if (mobileMenuToggle && navMenu) { | |
| mobileMenuToggle.addEventListener('click', function() { | |
| navMenu.classList.toggle('active'); | |
| mobileMenuToggle.setAttribute('aria-expanded', | |
| navMenu.classList.contains('active')); | |
| }); | |
| // Close menu when clicking outside | |
| document.addEventListener('click', function(event) { | |
| if (!event.target.closest('nav') && navMenu.classList.contains('active')) { | |
| navMenu.classList.remove('active'); | |
| mobileMenuToggle.setAttribute('aria-expanded', 'false'); | |
| } | |
| }); | |
| } | |
| // Contact form handling | |
| const contactForm = document.getElementById('contactForm'); | |
| const formMessage = document.getElementById('formMessage'); | |
| if (contactForm && formMessage) { | |
| contactForm.addEventListener('submit', function(e) { | |
| e.preventDefault(); | |
| // Simple validation | |
| const name = document.getElementById('name').value; | |
| const email = document.getElementById('email').value; | |
| const subject = document.getElementById('subject').value; | |
| const message = document.getElementById('message').value; | |
| if (!name || !email || !subject || !message) { | |
| formMessage.textContent = 'Please fill in all fields.'; | |
| formMessage.className = 'form-message error'; | |
| return; | |
| } | |
| // Email validation | |
| const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; | |
| if (!emailRegex.test(email)) { | |
| formMessage.textContent = 'Please enter a valid email address.'; | |
| formMessage.className = 'form-message error'; | |
| return; | |
| } | |
| // Simulate form submission | |
| formMessage.textContent = 'Thank you for your message! We\'ll get back to you soon.'; | |
| formMessage.className = 'form-message success'; | |
| // Reset form | |
| contactForm.reset(); | |
| // Clear message after 5 seconds | |
| setTimeout(() => { | |
| formMessage.textContent = ''; | |
| formMessage.className = 'form-message'; | |
| }, 5000); | |
| }); | |
| } | |
| // Smooth scrolling for anchor links | |
| document.querySelectorAll('a[href^="#"]').forEach(anchor => { | |
| anchor.addEventListener('click', function(e) { | |
| e.preventDefault(); | |
| const targetId = this.getAttribute('href'); | |
| if (targetId === '#') return; | |
| const targetElement = document.querySelector(targetId); | |
| if (targetElement) { | |
| targetElement.scrollIntoView({ | |
| behavior: 'smooth', | |
| block: 'start' | |
| }); | |
| } | |
| }); | |
| }); | |
| // Current page highlighting | |
| const currentPage = location.pathname.split('/').pop(); | |
| const navLinks = document.querySelectorAll('.nav-menu a'); | |
| navLinks.forEach(link => { | |
| const linkPage = link.getAttribute('href'); | |
| if (currentPage === linkPage || (currentPage === '' && linkPage === 'index.html')) { | |
| link.classList.add('active'); | |
| } else { | |
| link.classList.remove('active'); | |
| } | |
| }); | |
| // Lazy loading for images (would be implemented with actual images) | |
| if ('IntersectionObserver' in window) { | |
| const lazyImages = document.querySelectorAll('img[data-src]'); | |
| const imageObserver = new IntersectionObserver((entries, observer) => { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| const img = entry.target; | |
| img.src = img.dataset.src; | |
| img.classList.remove('lazy'); | |
| imageObserver.unobserve(img); | |
| } | |
| }); | |
| }); | |
| lazyImages.forEach(img => { | |
| imageObserver.observe(img); | |
| }); | |
| } | |
| }); |