HervaMere

Contact HervaMere

Bring us your lawn care question.

Ask about course fit, group practice, equipment topics, or making the learning experience easier to access. Our team reviews messages with care.

`; document.getElementById('site-header').innerHTML = headerHTML; document.getElementById('site-footer').innerHTML = footerHTML; // Tailwind script function initTailwind() { document.documentElement.style.setProperty('--accent', '#0e7490'); } // Theme toggle function initTheme() { const themeKey = 'hervamere-theme'; const toggleBtns = document.querySelectorAll('#theme-toggle, #mobile-theme-toggle'); const savedTheme = localStorage.getItem(themeKey); if (savedTheme === 'dark') { document.body.classList.add('bg-slate-950', 'text-slate-200'); document.body.classList.remove('bg-slate-50', 'text-slate-800'); } toggleBtns.forEach(btn => { btn.addEventListener('click', () => { document.body.classList.toggle('bg-slate-950'); document.body.classList.toggle('text-slate-200'); document.body.classList.toggle('bg-slate-50'); document.body.classList.toggle('text-slate-800'); const isDark = document.body.classList.contains('bg-slate-950'); localStorage.setItem(themeKey, isDark ? 'dark' : 'light'); }); }); } // Cookie banner function initCookies() { const banner = document.getElementById('cookie-banner'); const acceptBtn = banner ? banner.querySelector('[data-accept-cookies]') : null; const KEY = 'hervamere-cookies'; if (!banner) return; function hideBanner() { banner.style.display = 'none'; } function showBanner() { banner.style.display = 'block'; } if (localStorage.getItem(KEY) === 'true') { hideBanner(); } else { showBanner(); } if (acceptBtn) { acceptBtn.addEventListener('click', () => { localStorage.setItem(KEY, 'true'); hideBanner(); }); } } // Mobile menu function initMobileMenu() { const btn = document.getElementById('mobile-menu-btn'); const nav = document.getElementById('mobile-nav'); if (!btn || !nav) return; btn.addEventListener('click', () => { nav.classList.toggle('hidden'); const expanded = btn.getAttribute('aria-expanded') === 'true'; btn.setAttribute('aria-expanded', !expanded); }); } // Modal handling function initModals() { // Login & Register const loginOpen = document.querySelectorAll('[data-open-login]'); const registerOpen = document.querySelectorAll('[data-open-register]'); const loginModal = document.getElementById('login-modal'); const registerModal = document.getElementById('register-modal'); const errorModal = document.getElementById('error-modal'); function showModal(modal) { if (modal) modal.classList.remove('hidden'); if (modal) modal.classList.add('flex'); } function hideModal(modal) { if (modal) { modal.classList.remove('flex'); modal.classList.add('hidden'); } } loginOpen.forEach(el => el.addEventListener('click', () => showModal(loginModal))); registerOpen.forEach(el => el.addEventListener('click', () => showModal(registerModal))); document.querySelectorAll('[data-close-modal]').forEach(btn => { btn.addEventListener('click', () => { hideModal(loginModal); hideModal(registerModal); hideModal(errorModal); }); }); [loginModal, registerModal, errorModal].forEach(modal => { if (modal) { modal.addEventListener('click', (e) => { if (e.target === modal) hideModal(modal); }); } }); } // Form validation with error modal function initContactForm() { const form = document.getElementById('contact-form'); const errorModal = document.getElementById('error-modal'); const errorText = document.getElementById('error-text'); const status = document.getElementById('form-status'); if (!form || !errorModal || !errorText) return; form.addEventListener('submit', function(e) { e.preventDefault(); const name = form.querySelector('[name="name"]').value.trim(); const email = form.querySelector('[name="email"]').value.trim(); const message = form.querySelector('[name="message"]').value.trim(); let errors = []; if (!name) errors.push('Name is required.'); if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) errors.push('Valid email is required.'); if (!message || message.length < 10) errors.push('Message must be at least 10 characters.'); if (errors.length > 0) { errorText.textContent = errors.join(' '); errorModal.classList.remove('hidden'); errorModal.classList.add('flex'); } else { status.textContent = 'Thank you — your message has been received.'; form.reset(); setTimeout(() => { status.textContent = ''; }, 4000); } }); } // Boot everything window.addEventListener('DOMContentLoaded', function() { initTailwind(); initTheme(); initCookies(); initMobileMenu(); initModals(); initContactForm(); }); })();