Terms of Service

Effective date: January 1, 2026

1. Agreement

By accessing or using KnotNode Studio services, you agree to these Terms and our Privacy Policy. If you do not agree, do not use the services.

2. Accounts

You must provide accurate information and keep your account secure. You are responsible for activities under your account.

3. Course access

We grant you a personal, non-transferable license to access purchased courses for personal, non-commercial use. We may update or retire content to improve the curriculum.

4. Payments & refunds

Prices are shown in USD unless noted. Refunds are available within 14 days if you completed less than 20% of the course and it was not as described. Some promotions may be non-refundable where stated.

5. Acceptable use

  • Do not share or resell course content or account access.
  • Do not upload content that is unlawful, infringing, or abusive.
  • Do not attempt to disrupt or reverse-engineer the service.

6. Intellectual property

All content is owned by KnotNode Studio or its licensors and is protected by intellectual property laws. You may not reproduce course materials except for personal learning.

7. Disclaimers

We provide educational content “as is.” We do not guarantee specific outcomes. Practice carefully and take breaks to avoid strain.

8. Limitation of liability

To the maximum extent permitted by law, KnotNode Studio is not liable for indirect, incidental, or consequential damages. Our total liability is limited to the amounts you paid in the 12 months before the claim.

9. Termination

We may suspend or terminate access for violations of these Terms. You may stop using the services at any time.

10. Changes to Terms

We may update these Terms. Continued use after changes constitutes acceptance.

11. Governing law

These Terms are governed by the laws of the State of California, excluding conflict of laws rules.

12. Contact

Questions? Email [email protected] or call +1 (415) 555-0138.

`; // Footer footerEl.innerHTML = ` `; } function bindAllEvents() { // Theme toggle const themeBtn = document.getElementById('open-theme'); if (themeBtn) { themeBtn.onclick = () => { const root = document.documentElement; const isDark = root.classList.contains('dark'); window.__kn_applyTheme(isDark ? 'light' : 'dark'); }; } // Mobile menu const mobileBtn = document.getElementById('open-mobile'); if (mobileBtn) { mobileBtn.onclick = () => { const menu = document.getElementById('mobile-menu'); if (menu) menu.classList.toggle('hidden'); }; } // Auth buttons const openLogin = document.getElementById('open-login'); const openRegister = document.getElementById('open-register'); const mOpenLogin = document.getElementById('m-open-login'); const mOpenRegister = document.getElementById('m-open-register'); const showAuth = (mode) => { const modal = document.getElementById('auth-modal'); const title = document.getElementById('auth-title'); const regFields = document.getElementById('register-fields'); if (modal && title) { title.textContent = mode === 'register' ? 'Create account' : 'Sign in'; if (regFields) regFields.classList.toggle('hidden', mode !== 'register'); modal.classList.remove('hidden'); modal.classList.add('flex'); } }; if (openLogin) openLogin.onclick = () => showAuth('login'); if (openRegister) openRegister.onclick = () => showAuth('register'); if (mOpenLogin) mOpenLogin.onclick = () => showAuth('login'); if (mOpenRegister) mOpenRegister.onclick = () => showAuth('register'); // Cookie banner logic const banner = document.getElementById('cookie-banner'); if (banner && !localStorage.getItem('knotnode_cookie_consent')) { setTimeout(() => banner.classList.remove('hidden'), 1200); } const acceptBtn = document.getElementById('cookie-accept'); const declineBtn = document.getElementById('cookie-decline'); if (acceptBtn) acceptBtn.onclick = () => { localStorage.setItem('knotnode_cookie_consent', 'accepted'); banner.classList.add('hidden'); }; if (declineBtn) declineBtn.onclick = () => { localStorage.setItem('knotnode_cookie_consent', 'declined'); banner.classList.add('hidden'); }; // Update cart / fallows count const cartCount = localStorage.getItem('cartCount') || '0'; const fallowsCount = localStorage.getItem('fallowsCount') || '0'; document.querySelectorAll('#nav-cart-count, #m-cart-count').forEach(el => el.textContent = cartCount); document.querySelectorAll('#nav-fallows-count, #m-fallows-count').forEach(el => el.textContent = fallowsCount); } function handleAuthSubmit(e) { e.preventDefault(); const modal = document.getElementById('auth-modal'); modal.classList.remove('flex'); modal.classList.add('hidden'); alert('Welcome! You are now signed in to KnotNode Studio.'); } function closeAuthModal() { const modal = document.getElementById('auth-modal'); modal.classList.remove('flex'); modal.classList.add('hidden'); } // Boot window.onload = async () => { initTheme(); await injectHeaderFooter(); bindAllEvents(); };