Keyword Gap Analyzer

Keyword Gap Analyzer

Discover keywords your competitors rank for, but you don't.

Keyword Gap

${analysis.gap.length.toLocaleString()}

Your Keywords

${analysis.yourKeywordCount.toLocaleString()}

Total Competitor Keywords

${analysis.totalCompetitorKeywords.toLocaleString()}

`; reportTableBody.innerHTML = ''; if (analysis.gap.length === 0) { reportTableBody.innerHTML = `No keyword gaps found!`; return; } analysis.gap.forEach(item => { const tr = document.createElement('tr'); tr.className = 'bg-white border-b hover:bg-gray-50'; const competitorsHtml = item.competitors.map(c => `${c}`).join(' '); const difficultyColor = item.difficulty > 70 ? 'bg-red-500' : item.difficulty > 40 ? 'bg-yellow-400' : 'bg-green-500'; tr.innerHTML = ` ${item.keyword} ${competitorsHtml} ${item.volume.toLocaleString()}
${item.difficulty}%
`; reportTableBody.appendChild(tr); }); }; // --- Tab & Navigation Logic --- function switchTab(targetTabId, runAnalysis = false) { if (runAnalysis) { // Show loader and switch tab immediately currentTab = targetTabId; tabs.forEach(tab => tab.classList.toggle('active', tab.dataset.tab === currentTab)); tabContents.forEach(content => content.classList.toggle('active', content.id === currentTab)); updateNavButtons(); loader.style.display = 'flex'; pdfContent.style.display = 'none'; // Simulate API delay setTimeout(() => { const analysisResult = analyzeKeywords(); renderReport(analysisResult); loader.style.display = 'none'; pdfContent.style.display = 'block'; }, 1500); } else { currentTab = targetTabId; tabs.forEach(tab => tab.classList.toggle('active', tab.dataset.tab === currentTab)); tabContents.forEach(content => content.classList.toggle('active', content.id === currentTab)); updateNavButtons(); } } function updateNavButtons() { if (currentTab === 'input') { prevBtn.style.display = 'none'; nextBtn.style.display = 'inline-flex'; pdfButtonContainer.style.display = 'none'; } else { prevBtn.style.display = 'inline-flex'; nextBtn.style.display = 'none'; pdfButtonContainer.style.display = 'block'; } } // --- Event Handlers --- tabs.forEach(tab => tab.addEventListener('click', () => switchTab(tab.dataset.tab))); nextBtn.addEventListener('click', () => switchTab('report', true)); prevBtn.addEventListener('click', () => switchTab('input')); // --- PDF Download --- downloadPdfBtn.addEventListener('click', async () => { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'l', unit: 'mm', format: 'a4' }); const content = document.getElementById('pdf-content'); document.getElementById('pdf-date').textContent = `Report Generated: ${new Date().toLocaleString()}`; const canvas = await html2canvas(content, { scale: 2 }); const imgData = canvas.toDataURL('image/jpeg', 1.0); const imgProps = doc.getImageProperties(imgData); const pdfWidth = doc.internal.pageSize.getWidth() - 20; const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width; doc.addImage(imgData, 'JPEG', 10, 10, pdfWidth, pdfHeight); document.getElementById('pdf-date').textContent = ''; doc.save(`Keyword-Gap-Report-${new Date().toISOString().slice(0,10)}.pdf`); }); // --- Initial Load --- updateNavButtons(); });
Scroll to Top