/* NFGuard Site — Main JS */ document.addEventListener('DOMContentLoaded', () => { /* -- Copy install command -- */ const copyBtn = document.getElementById('copy-btn'); const copyIcon = document.getElementById('copy-icon'); if (copyBtn) { copyBtn.addEventListener('click', () => { const cmd = 'curl -sL https://raw.githubusercontent.com/dolutech/nfguard-cli/main/install.sh | sudo bash'; navigator.clipboard.writeText(cmd).then(() => { copyIcon.textContent = '\u2705'; copyBtn.classList.add('copied'); setTimeout(() => { copyIcon.textContent = '\uD83D\uDCCB'; copyBtn.classList.remove('copied'); }, 2000); }); }); } /* -- Mobile hamburger menu -- */ const hamburger = document.querySelector('.navbar-hamburger'); const navLinks = document.querySelector('.navbar-links'); if (hamburger && navLinks) { hamburger.addEventListener('click', () => { navLinks.classList.toggle('open'); }); navLinks.querySelectorAll('a').forEach(link => { link.addEventListener('click', () => navLinks.classList.remove('open')); }); } /* -- Smooth scroll for anchor links -- */ document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', e => { const target = document.querySelector(anchor.getAttribute('href')); if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); /* -- Docs mobile sidebar toggle -- */ const sidebarToggle = document.querySelector('.docs-sidebar-toggle'); const docsSidebar = document.querySelector('.docs-sidebar'); if (sidebarToggle && docsSidebar) { sidebarToggle.addEventListener('click', () => { docsSidebar.classList.toggle('open'); sidebarToggle.setAttribute( 'aria-expanded', docsSidebar.classList.contains('open') ? 'true' : 'false' ); }); /* Close sidebar when a link is clicked (mobile) */ docsSidebar.querySelectorAll('a').forEach(link => { link.addEventListener('click', () => { if (window.innerWidth <= 768) { docsSidebar.classList.remove('open'); } }); }); } /* -- Docs sidebar active state -- */ const sidebarLinks = document.querySelectorAll('.docs-sidebar a'); if (sidebarLinks.length > 0) { const sections = []; sidebarLinks.forEach(link => { const href = link.getAttribute('href'); if (href && href.startsWith('#')) { const section = document.querySelector(href); if (section) sections.push({ link, section }); } }); const onScroll = () => { const scrollPos = window.scrollY + 120; let current = sections[0]; for (const item of sections) { if (item.section.offsetTop <= scrollPos) current = item; } sidebarLinks.forEach(l => l.classList.remove('active')); if (current) current.link.classList.add('active'); }; window.addEventListener('scroll', onScroll, { passive: true }); onScroll(); } /* -- Fade-in on scroll -- */ const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('visible'); observer.unobserve(entry.target); } }); }, { threshold: 0.1 }); document.querySelectorAll('.fade-in').forEach(el => observer.observe(el)); });