let documents = [];
let currentDocument = null;
// Load document list
async function loadDocuments() {
try {
const response = await fetch('/api/documents');
const data = await response.json();
documents = data.documents || [];
const listEl = document.getElementById('document-list');
if (documents.length === 0) {
listEl.innerHTML = '
No documents available
';
return;
}
listEl.innerHTML = documents.map(doc => `
`).join('');
// Auto-load first document
if (documents.length > 0) {
loadDocument(documents[0].slug);
}
} catch (error) {
console.error('Error loading documents:', error);
document.getElementById('document-list').innerHTML =
'Error loading documents
';
}
}
// Load specific document
async function loadDocument(slug) {
try {
const response = await fetch(`/api/documents/${slug}`);
const data = await response.json();
currentDocument = data.document;
// Update active state
document.querySelectorAll('.doc-link').forEach(el => {
if (el.dataset.slug === slug) {
el.classList.add('bg-blue-100', 'text-blue-900');
} else {
el.classList.remove('bg-blue-100', 'text-blue-900');
}
});
// Render content
const contentEl = document.getElementById('document-content');
contentEl.innerHTML = `
${currentDocument.content_html}
`;
// Render table of contents
renderTOC(currentDocument.toc || []);
// Scroll to top
window.scrollTo(0, 0);
} catch (error) {
console.error('Error loading document:', error);
document.getElementById('document-content').innerHTML = `
`;
}
}
// Render table of contents
function renderTOC(toc) {
const tocEl = document.getElementById('toc');
if (!toc || toc.length === 0) {
tocEl.innerHTML = 'No table of contents
';
return;
}
tocEl.innerHTML = toc
.filter(item => item.level <= 3) // Only show H1, H2, H3
.map(item => {
const indent = (item.level - 1) * 12;
return `
${item.title}
`;
}).join('');
}
// Initialize
loadDocuments();