VoxVerdant

Effective January 1, 2025

Terms of Use

These terms describe the conditions for using VoxVerdant's website and educational materials. By using the site, you agree to follow them.

1. Educational purpose

VoxVerdant provides general educational material about dishwasher installation planning, fitting, connections, testing, and maintenance. Content is not a substitute for site-specific inspection, local code advice, or work by a licensed professional.

2. Responsible decisions

You are responsible for assessing your tools, workspace, appliance instructions, local requirements, and experience. Stop work when conditions are unclear, unsafe, damaged, or outside your competence. Never work on live electrical systems or pressurized services without appropriate qualifications.

3. Accounts and access

Where account controls are displayed, provide accurate information and protect access credentials. The demonstration authentication dialogs do not create a live account unless a separate service explicitly confirms one.

4. Catalog, cart, and Fallows

Course descriptions and prices are presented for the website experience and may change. Fallows and cart data are stored locally in your browser. The cart does not process payment, reserve enrollment, or create a binding order. The review modal is not a purchase confirmation.

5. Acceptable use

Do not interfere with the website, bypass access controls, scrape private information, upload harmful code, impersonate another person, or use VoxVerdant content to encourage unsafe work.

6. Intellectual property

VoxVerdant names, written lessons, layouts, course descriptions, and original interface elements belong to VoxVerdant or its licensors. You may view the site for personal or internal evaluation. Reproduction, resale, or public redistribution requires written permission.

7. Accuracy and availability

We aim for clear, current material but cannot guarantee that every example applies to every appliance, room, jurisdiction, or installation condition. The website may be changed, interrupted, or withdrawn without notice.

8. Limitation of responsibility

To the extent permitted by law, VoxVerdant is not responsible for injury, property damage, service interruption, loss of data, or project costs resulting from relying on general educational content without suitable assessment and professional advice.

9. Changes and contact

We may update these terms by publishing a revised effective date. Questions about these terms can be sent through Contact or to [email protected].

`; const footerHTML = ` `; const headerContainer = document.getElementById('site-header'); const footerContainer = document.getElementById('site-footer'); headerContainer.innerHTML = headerHTML; footerContainer.innerHTML = footerHTML; // Initialize header scripts const header = headerContainer; const menuToggle = header.querySelector('[data-menu-toggle]'); const mobileNav = header.querySelector('[data-mobile-nav]'); const themeToggle = header.querySelector('[data-theme-toggle]'); const loginBtn = header.querySelector('[data-open-login]'); const registerBtn = header.querySelector('[data-open-register]'); const authModal = header.querySelector('[data-auth-modal]'); const registerModal = header.querySelector('[data-register-modal]'); const closeButtons = header.querySelectorAll('[data-close-modal]'); if (menuToggle && mobileNav) { menuToggle.addEventListener('click', () => { const isHidden = mobileNav.classList.contains('hidden'); mobileNav.classList.toggle('hidden', !isHidden); menuToggle.setAttribute('aria-expanded', isHidden); }); } if (themeToggle) { const root = document.documentElement; const savedTheme = localStorage.getItem('voxverdant-theme'); if (savedTheme === 'dark') { root.classList.add('dark'); } themeToggle.addEventListener('click', () => { root.classList.toggle('dark'); localStorage.setItem('voxverdant-theme', root.classList.contains('dark') ? 'dark' : 'light'); }); } function showModal(modal) { modal.classList.remove('hidden'); modal.classList.add('flex'); } function hideModal(modal) { modal.classList.remove('flex'); modal.classList.add('hidden'); } if (loginBtn && authModal) loginBtn.addEventListener('click', () => showModal(authModal)); if (registerBtn && registerModal) registerBtn.addEventListener('click', () => showModal(registerModal)); closeButtons.forEach(btn => { btn.addEventListener('click', () => { if (authModal) hideModal(authModal); if (registerModal) hideModal(registerModal); }); }); if (authModal) authModal.addEventListener('click', e => { if (e.target === authModal) hideModal(authModal); }); if (registerModal) registerModal.addEventListener('click', e => { if (e.target === registerModal) hideModal(registerModal); }); // Initialize footer scripts const footer = footerContainer; const banner = footer.querySelector('[data-cookie-banner]'); const accept = footer.querySelector('[data-accept-cookies]'); const KEY = 'voxverdant-cookies'; function showBanner() { if (!localStorage.getItem(KEY)) { banner.classList.remove('hidden'); banner.classList.add('flex'); } } function hideBanner() { banner.classList.remove('flex'); banner.classList.add('hidden'); localStorage.setItem(KEY, 'accepted'); } if (accept) accept.addEventListener('click', hideBanner); showBanner(); })();