AI-Powered Concept Clustering Tool
Organize your ideas into logical groups automatically.
Clustered Concepts
No clusters could be formed from the provided concepts.
'; return; } for (const clusterName in data) { const items = data[clusterName]; const clusterEl = document.createElement('div'); clusterEl.className = 'p-4 border rounded-lg'; let itemsHTML = items.map(item => `${item}`).join(''); clusterEl.innerHTML = `${clusterName}
${itemsHTML}
`;
resultsWrapper.appendChild(clusterEl);
}
pdfBtnContainer.classList.remove('hidden');
};
// --- PDF Export ---
pdfBtn.addEventListener('click', () => {
if (!clusteredData) {
showMessage('No clusters to download.', 'error');
return;
}
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
doc.setFontSize(18);
doc.text('Concept Clustering Report', 105, 20, { align: 'center' });
let yPos = 35;
for (const clusterName in clusteredData) {
if (yPos > 250) { // Add new page if content overflows
doc.addPage();
yPos = 20;
}
doc.setFontSize(14);
doc.setFont(undefined, 'bold');
doc.setTextColor(79, 70, 229); // Indigo
doc.text(clusterName, 15, yPos);
yPos += 8;
doc.setFontSize(11);
doc.setFont(undefined, 'normal');
doc.setTextColor(0, 0, 0);
const itemsText = clusteredData[clusterName].join(', ');
const splitText = doc.splitTextToSize(itemsText, 180);
doc.text(splitText, 15, yPos);
yPos += (splitText.length * 5) + 8;
}
doc.save('concept-clusters.pdf');
});
// --- Utility ---
const showMessage = (message, type = 'success') => {
messageBox.textContent = message;
messageBox.className = `message-box ${type} show`;
setTimeout(() => { messageBox.classList.remove('show'); }, 3000);
};
});
