// Mobile menu toggle
document.addEventListener('DOMContentLoaded', function() {
const mobileMenuBtn = document.getElementById('mobile-menu-btn');
const mobileMenu = document.getElementById('mobile-menu');
mobileMenuBtn.addEventListener('click', function() {
mobileMenu.classList.toggle('hidden');
});
// Close mobile menu when clicking on a link
const mobileLinks = mobileMenu.querySelectorAll('a');
mobileLinks.forEach(link => {
link.addEventListener('click', () => {
mobileMenu.classList.add('hidden');
});
});
});
// Smooth scrolling 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) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// Form submission handling
document.getElementById('contact-form')?.addEventListener('submit', function(e) {
e.preventDefault();
// Add loading state
const submitBtn = this.querySelector('button[type="submit"]');
const originalText = submitBtn.textContent;
submitBtn.innerHTML = ' Enviando...';
submitBtn.disabled = true;
// Simulate form submission
setTimeout(() => {
// Reset form
this.reset();
// Show success message
submitBtn.textContent = '✓ Enviado com sucesso!';
submitBtn.classList.add('bg-green-600', 'form-success');
submitBtn.classList.remove('bg-blue-600');
// Reset button after 3 seconds
setTimeout(() => {
submitBtn.textContent = originalText;
submitBtn.classList.remove('bg-green-600', 'form-success');
submitBtn.classList.add('bg-blue-600');
submitBtn.disabled = false;
}, 3000);
}, 2000);
});
// Parallax effect for hero section
window.addEventListener('scroll', () => {
const scrolled = window.pageYOffset;
const hero = document.querySelector('#home');
if (hero) {
hero.style.transform = `translateY(${scrolled * 0.5}px)`;
}
});
// Intersection Observer for fade-in animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
// Observe all sections for animation
document.querySelectorAll('section').forEach(section => {
section.style.opacity = '0';
section.style.transform = 'translateY(20px)';
section.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
observer.observe(section);
});
// Dynamic particles effect
function createParticles() {
const hero = document.querySelector('#home');
if (!hero) return;
const particlesContainer = document.createElement('div');
particlesContainer.className = 'hero-particles';
for (let i = 0; i < 20; i++) {
const particle = document.createElement('div');
particle.className = 'particle';
particle.style.width = Math.random() * 50 + 20 + 'px';
particle.style.height = particle.style.width;
particle.style.left = Math.random() * 100 + '%';
particle.style.top = Math.random() * 100 + '%';
particle.style.animationDelay = Math.random() * 6 + 's';
particle.style.animationDuration = (Math.random() * 3 + 3) + 's';
particlesContainer.appendChild(particle);
}
hero.appendChild(particlesContainer);
}
// Initialize particles when page loads
window.addEventListener('load', createParticles);
// Dynamic copyright year
const currentYear = new Date().getFullYear();
const copyrightElement = document.querySelector('footer p');
if (copyrightElement) {
copyrightElement.textContent = `© ${currentYear} E-quality Lab. Todos os direitos reservados.`;
}
// Floating WhatsApp button (optional)
function createWhatsAppButton() {
const whatsappBtn = document.createElement('a');
whatsappBtn.href = 'https://wa.me/5511123456789'; // Replace with actual number
whatsappBtn.target = '_blank';
whatsappBtn.className = 'floating-btn bg-green-600 hover:bg-green-700 w-14 h-14 rounded-full flex items-center justify-center shadow-lg transition-all';
whatsappBtn.innerHTML = '';
// Add to DOM
document.body.appendChild(whatsappBtn);
// Re-render feather icons
feather.replace();
}
// Initialize WhatsApp button (optional)
// createWhatsAppButton();
// Active navigation highlight
window.addEventListener('scroll', () => {
const sections = document.querySelectorAll('section[id]');
const scrollPosition = window.scrollY + 100;
sections.forEach(section => {
const sectionTop = section.offsetTop;
const sectionHeight = section.clientHeight;
const sectionId = section.getAttribute('id');
if (scrollPosition >= sectionTop && scrollPosition < sectionTop + sectionHeight) {
document.querySelectorAll('nav a').forEach(link => {
link.classList.remove('text-blue-400');
if (link.getAttribute('href') === `#${sectionId}`) {
link.classList.add('text-blue-400');
}
});
}
});
});
// Debounce function for scroll events
function debounce(func, wait, immediate) {
let timeout;
return function executedFunction(...args) {
const later = () => {
timeout = null;
if (!immediate) func(...args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func(...args);
};
}
// Improve performance with debounced scroll events
const debouncedScrollHandler = debounce(() => {
// Scroll-related code here
}, 10);
window.addEventListener('scroll', debouncedScrollHandler);
// Add loading animation for images
document.querySelectorAll('img').forEach(img => {
img.addEventListener('load', function() {
this.style.opacity = '0';
this.style.transition = 'opacity 0.3s ease';
setTimeout(() => {
this.style.opacity = '1';
}, 100);
});
});
// Preload images for better performance
function preloadImages() {
const images = [
'http://static.photos/laboratory/1200x630/42',
'http://static.photos/laboratory/640x360/123',
'http://static.photos/technology/640x360/456',
'http://static.photos/science/640x480/789'
];
images.forEach(src => {
const img = new Image();
img.src = src;
});
}
// Initialize preloading
preloadImages();
// Add typing effect to hero title
function typeWriter(element, text, speed = 50) {
let i = 0;
element.textContent = '';
function type() {
if (i < text.length) {
element.textContent += text.charAt(i);
i++;
setTimeout(type, speed);
}
}
type();
}
// Initialize typing effect when hero is visible
const heroTitle = document.querySelector('#home h1');
if (heroTitle) {
const originalText = heroTitle.textContent;
const heroObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
typeWriter(heroTitle, originalText, 50);
heroObserver.unobserve(entry.target);
}
});
});
heroObserver.observe(heroTitle);
}