69 lines
2.5 KiB
JavaScript
69 lines
2.5 KiB
JavaScript
const mobileToggle = document.querySelector('.mobile-menu-toggle');
|
|
const navLinks = document.querySelector('.nav-links');
|
|
const navContact = document.querySelector('.nav-contact');
|
|
mobileToggle.addEventListener('click', () => {
|
|
navLinks.classList.toggle('active');
|
|
navContact.classList.toggle('active');
|
|
mobileToggle.classList.toggle('active');
|
|
});
|
|
const dropdownLabel = document.querySelector('.dropdown-label');
|
|
const navDropdown = document.querySelector('.nav-dropdown');
|
|
if (dropdownLabel && navDropdown) {
|
|
dropdownLabel.addEventListener('click', function(e) {
|
|
if (window.innerWidth <= 768) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
navDropdown.classList.toggle('open');
|
|
}
|
|
});
|
|
document.addEventListener('click', function(e) {
|
|
if (!navDropdown.contains(e.target)) {
|
|
navDropdown.classList.remove('open');
|
|
}
|
|
});
|
|
}
|
|
document.querySelectorAll('.dropdown-toggle').forEach(toggle => {
|
|
toggle.addEventListener('click', function() {
|
|
this.classList.toggle('active');
|
|
this.nextElementSibling.classList.toggle('active');
|
|
});
|
|
});
|
|
const form = document.getElementById('quoteForm');
|
|
if (form) {
|
|
form.addEventListener('submit', function(e) {
|
|
e.preventDefault();
|
|
alert('Thank you for your quote request! We will contact you shortly.');
|
|
this.reset();
|
|
});
|
|
}
|
|
|
|
// How It Works — scroll-triggered step reveal
|
|
(function () {
|
|
function initProcess() {
|
|
var track = document.querySelector('.process-track');
|
|
if (!track) return;
|
|
var steps = track.querySelectorAll('.process-step');
|
|
var observer = new IntersectionObserver(function (entries) {
|
|
entries.forEach(function (entry) {
|
|
if (entry.isIntersecting) {
|
|
track.classList.add('animated');
|
|
steps.forEach(function (step, i) {
|
|
setTimeout(function () {
|
|
step.classList.add('visible');
|
|
}, i * 220);
|
|
});
|
|
observer.disconnect();
|
|
}
|
|
});
|
|
}, { threshold: 0.25 });
|
|
observer.observe(track);
|
|
}
|
|
// components.js runs before main.js, but process section is injected synchronously
|
|
// so it's available immediately
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', initProcess);
|
|
} else {
|
|
initProcess();
|
|
}
|
|
}());
|