backup
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
(function () {
|
||||
var NAV = `<nav class="navbar">
|
||||
<a href="/" class="logo">
|
||||
<span class="logo-text">Lahr <span class="logo-highlight">Carpet</span></span>
|
||||
</a>
|
||||
<ul class="nav-links">
|
||||
<li><a href="/">Home</a></li>
|
||||
<li><a href="/our-work/">Our Work</a></li>
|
||||
<li><a href="/about/">About</a></li>
|
||||
<li>
|
||||
<div class="nav-dropdown">
|
||||
<span class="dropdown-label">Company <i class="fas fa-caret-down"></i></span>
|
||||
<div class="dropdown-menu">
|
||||
<a href="/about/">About Us</a>
|
||||
<a href="/service-area/">Service Area</a>
|
||||
<a href="/reviews/">Reviews</a>
|
||||
<a href="/contact/">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="nav-dropdown">
|
||||
<span class="dropdown-label">Residential <i class="fas fa-caret-down"></i></span>
|
||||
<div class="dropdown-menu">
|
||||
<a href="/services/carpet-cleaning/">Carpet Cleaning</a>
|
||||
<a href="/services/stairs/">Stairs Cleaning</a>
|
||||
<a href="/services/upholstery/">Upholstery Cleaning</a>
|
||||
<a href="/services/floors/">Floor Cleaning</a>
|
||||
<a href="/services/area-rugs/">Area Rug Cleaning</a>
|
||||
<a href="/services/add-ons/">Add-On Services</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="nav-dropdown">
|
||||
<span class="dropdown-label">Commercial <i class="fas fa-caret-down"></i></span>
|
||||
<div class="dropdown-menu">
|
||||
<a href="/services/commercial/">Commercial Overview</a>
|
||||
<a href="/commercial/vacation-rentals/">Vacation Rentals</a>
|
||||
<a href="/commercial/offices/">Offices</a>
|
||||
<a href="/commercial/hotels-inns/">Hotels & Inns</a>
|
||||
<a href="/commercial/retail-showrooms/">Retail & Showrooms</a>
|
||||
<a href="/commercial/property-management/">Property Management</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="nav-contact">
|
||||
<a href="https://www.facebook.com/profile.php?id=61559554960851" class="social-icon" aria-label="Facebook" target="_blank"><i class="fab fa-facebook-f"></i></a>
|
||||
<a href="https://www.instagram.com/lahrautospa/" class="social-icon" aria-label="Instagram" target="_blank"><i class="fab fa-instagram"></i></a>
|
||||
<a href="tel:315-719-1218" class="btn btn-primary"><i class="fas fa-phone"></i></a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Toggle menu">
|
||||
<span></span><span></span><span></span>
|
||||
</button>
|
||||
</nav>`;
|
||||
|
||||
var FOOTER = `<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-grid">
|
||||
<div class="footer-brand">
|
||||
<a href="/" class="footer-logo">
|
||||
<span class="logo-text">Lahr <span class="logo-highlight">Carpet</span></span>
|
||||
</a>
|
||||
<p>We clean carpets, upholstery, rugs, and hard floors for homes and businesses in Waterloo, Geneva, and the Finger Lakes region.</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<h4>Services</h4>
|
||||
<ul>
|
||||
<li><a href="/services/carpet-cleaning/">Carpet Cleaning</a></li>
|
||||
<li><a href="/services/stairs/">Stairs Cleaning</a></li>
|
||||
<li><a href="/services/upholstery/">Upholstery Cleaning</a></li>
|
||||
<li><a href="/services/floors/">Floor Cleaning</a></li>
|
||||
<li><a href="/services/add-ons/">Add-On Services</a></li>
|
||||
<li><a href="/services/area-rugs/">Area Rug Cleaning</a></li>
|
||||
<li><a href="/services/commercial/">Commercial Cleaning</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<h4>Service Areas</h4>
|
||||
<ul>
|
||||
<li><a href="/locations/waterloo-ny/">Waterloo, NY</a></li>
|
||||
<li><a href="/locations/geneva-ny/">Geneva, NY</a></li>
|
||||
<li><a href="/locations/seneca-falls-ny/">Seneca Falls, NY</a></li>
|
||||
<li><a href="/locations/canandaigua-ny/">Canandaigua, NY</a></li>
|
||||
<li><a href="/locations/penn-yan-ny/">Penn Yan, NY</a></li>
|
||||
<li><a href="/locations/victor-ny/">Victor, NY</a></li>
|
||||
<li><a href="/locations/newark-ny/">Newark, NY</a></li>
|
||||
<li><a href="/locations/">All Locations →</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<h4>Contact Us</h4>
|
||||
<ul>
|
||||
<li><i class="fas fa-phone"></i> <a href="tel:315-719-1218">315-719-1218</a></li>
|
||||
<li><i class="fas fa-envelope"></i> <a href="mailto:lahrcarpet@gmail.com">lahrcarpet@gmail.com</a></li>
|
||||
<li><i class="fas fa-location-dot"></i> 1076 Waterloo/Geneva Road, Waterloo, NY</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-bottom">
|
||||
<div class="container">
|
||||
<p>© 2025 All Rights Reserved. Lahr Carpet Cleaning</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>`;
|
||||
|
||||
var PROCESS = `<section class="how-it-works">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<span class="section-label">How It Works</span>
|
||||
<h2 class="section-title">Getting Started Is Simple</h2>
|
||||
<p class="section-subtitle">Three steps from first contact to clean carpets.</p>
|
||||
</div>
|
||||
<div class="process-track">
|
||||
<div class="process-connector"><div class="process-connector-fill"></div></div>
|
||||
<div class="process-step">
|
||||
<div class="process-num">1</div>
|
||||
<h3>Contact Us</h3>
|
||||
<p>Call or submit the form online. Tell us what you need cleaned and we will confirm availability for your area.</p>
|
||||
</div>
|
||||
<div class="process-step">
|
||||
<div class="process-num">2</div>
|
||||
<h3>We Arrive and Clean</h3>
|
||||
<p>Our technician arrives on time with professional equipment. We pre-treat, extract, and inspect before we leave.</p>
|
||||
</div>
|
||||
<div class="process-step">
|
||||
<div class="process-num">3</div>
|
||||
<h3>Enjoy the Results</h3>
|
||||
<p>Your carpets dry in hours. You will see and smell the difference the same day we finish.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>`;
|
||||
|
||||
var navEl = document.getElementById('site-nav');
|
||||
var footerEl = document.getElementById('site-footer');
|
||||
var processEl = document.getElementById('site-process');
|
||||
if (navEl) navEl.innerHTML = NAV;
|
||||
if (footerEl) footerEl.innerHTML = FOOTER;
|
||||
if (processEl) processEl.outerHTML = PROCESS;
|
||||
})();
|
||||
@@ -0,0 +1,68 @@
|
||||
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();
|
||||
}
|
||||
}());
|
||||
Reference in New Issue
Block a user