[Back] // 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);