// Theme Toggle document.addEventListener('DOMContentLoaded', function() { const themeToggle = document.getElementById('themeToggle'); const html = document.documentElement; if (themeToggle) { themeToggle.addEventListener('click', () => { const currentTheme = html.getAttribute('data-theme'); const newTheme = currentTheme === 'light' ? 'dark' : 'light'; html.setAttribute('data-theme', newTheme); localStorage.setItem('theme', newTheme); }); } // Load saved theme const savedTheme = localStorage.getItem('theme') || 'light'; html.setAttribute('data-theme', savedTheme); // Mobile menu toggle const mobileMenuToggle = document.getElementById('mobileMenuToggle'); const navMenu = document.getElementById('navMenu'); if (mobileMenuToggle && navMenu) { mobileMenuToggle.addEventListener('click', () => { navMenu.classList.toggle('active'); mobileMenuToggle.classList.toggle('active'); }); } // Close modal on outside click document.addEventListener('click', (e) => { if (e.target.classList.contains('modal-overlay')) { closeContactModal(); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { closeContactModal(); } }); // Navbar scroll effect const navbar = document.getElementById('navbar'); if (navbar) { window.addEventListener('scroll', () => { if (window.scrollY > 100) { navbar.style.background = 'rgba(255, 255, 255, 0.95)'; navbar.style.backdropFilter = 'blur(20px)'; navbar.style.borderBottom = '1px solid rgba(0, 0, 0, 0.1)'; } else { navbar.style.background = 'rgba(255, 255, 255, 0.1)'; navbar.style.backdropFilter = 'blur(20px)'; navbar.style.borderBottom = '1px solid rgba(255, 255, 255, 0.2)'; } }); } }); // Smooth scrolling function function scrollToSection(sectionId) { const element = document.getElementById(sectionId); if (element) { element.scrollIntoView({ behavior: 'smooth', block: 'start' }); } } // Modal functions function openContactModal() { const modal = document.getElementById('contactModal'); if (modal) { modal.classList.add('active'); document.body.style.overflow = 'hidden'; // Focus first input setTimeout(() => { const firstInput = modal.querySelector('input'); if (firstInput) firstInput.focus(); }, 300); } } function closeContactModal() { const modal = document.getElementById('contactModal'); if (modal) { modal.classList.remove('active'); document.body.style.overflow = ''; } } // Form handling for regular contact form function handleFormSubmit(event) { event.preventDefault(); const form = event.target; const formData = new FormData(form); // Basic validation const firstName = formData.get('first_name'); const lastName = formData.get('last_name'); const email = formData.get('email'); const message = formData.get('message'); if (!firstName || !lastName || !email || !message) { showErrorMessage('Please fill in all required fields.'); return; } // Email validation const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { showErrorMessage('Please enter a valid email address.'); return; } // Show success message showSuccessMessage('Thank you! Your message has been sent successfully.'); form.reset(); } function showErrorMessage(message) { const errorDiv = document.createElement('div'); errorDiv.innerHTML = ` <div style=" position: fixed; top: 20px; right: 20px; background: linear-gradient(135deg, #ef4444, #dc2626); color: white; padding: 1rem 2rem; border-radius: 0.75rem; box-shadow: 0 10px 25px rgba(239, 68, 68, 0.3); z-index: 2001; animation: slideInRight 0.4s ease-out; max-width: 400px; "> <div style="display: flex; align-items: center; gap: 0.75rem;"> <span style="font-size: 1.25rem;">❌</span> <div> <strong style="display: block;">Error</strong> <span style="font-size: 0.9rem; opacity: 0.9;">${message}</span> </div> </div> </div> `; document.body.appendChild(errorDiv); setTimeout(() => { errorDiv.style.animation = 'slideOutRight 0.4s ease-in'; setTimeout(() => errorDiv.remove(), 400); }, 3000); } // Add CSS animations for notifications const style = document.createElement('style'); style.textContent = ` @keyframes slideInRight { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes slideOutRight { from { transform: translateX(0); opacity: 1; } to { transform: translateX(100%); opacity: 0; } } `; document.head.appendChild(style);