Legal Blog Post Generator

Legal Blog Post Generator

Generate clear and informative legal articles and blog posts.

Please enter a legal topic for the article.

'; return; } let postHTML = `

An Overview of ${topic}

`; selectedSections.forEach(key => { if (sectionTemplates[key]) { postHTML += sectionTemplates[key](topic, audience); } }); postContainer.innerHTML = postHTML; outputTitle.textContent = `Generated Article: ${topic}`; downloadPdfBtn.classList.remove('hidden'); }; const downloadPdf = () => { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const content = getEl('generated-post-container'); const title = `An Overview of ${topicInput.value.trim()}`; const audience = `Prepared for: ${audienceInput.value.trim()}`; const pageWidth = doc.internal.pageSize.getWidth(); const margin = 20; // --- PDF Template: Legal Memorandum --- doc.setDrawColor(48, 63, 81); doc.setLineWidth(10); doc.line(0, 0, 0, 297); // Left border doc.setFont('helvetica', 'bold'); doc.setFontSize(20); doc.setTextColor(48, 63, 81); const splitTitle = doc.splitTextToSize(title, pageWidth - (margin * 2) - 10); doc.text(splitTitle, margin, 25); doc.setLineWidth(0.5); doc.line(margin, 35 + (splitTitle.length * 7), pageWidth - margin, 35 + (splitTitle.length * 7)); doc.setFont('helvetica', 'normal'); doc.setFontSize(10); doc.setTextColor(100, 116, 139); doc.text(audience, margin, 42 + (splitTitle.length * 7)); let startY = 50 + (splitTitle.length * 7); html2canvas(content, { scale: 2, useCORS: true, windowWidth: content.scrollWidth, windowHeight: content.scrollHeight }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const imgProps = doc.getImageProperties(imgData); const pdfWidth = pageWidth - margin - 25; // Adjusted for left border const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width; let heightLeft = pdfHeight; let position = startY; doc.addImage(imgData, 'PNG', margin, position, pdfWidth, pdfHeight, undefined, 'FAST'); heightLeft -= (doc.internal.pageSize.getHeight() - position - 15); while (heightLeft >= 0) { position = heightLeft - pdfHeight; doc.addPage(); doc.addImage(imgData, 'PNG', margin, position, pdfWidth, pdfHeight, undefined, 'FAST'); heightLeft -= doc.internal.pageSize.getHeight(); } // Footer on all pages const pageCount = doc.internal.getNumberOfPages(); for(let i = 1; i <= pageCount; i++) { doc.setPage(i); doc.setDrawColor(48, 63, 81); doc.setLineWidth(10); doc.line(0, 0, 0, 297); // Re-draw border on new pages doc.setFontSize(9); doc.setTextColor(148, 163, 184); doc.text( `Page ${i} of ${pageCount}`, pageWidth - margin, 285, { align: 'right' } ); } doc.save(`Legal_Article_${topicInput.value.trim().replace(/\s/g, '_')}.pdf`); }).catch(err => { console.error("Error generating PDF:", err); alert("Could not generate PDF. See console for details."); }); }; const showTab = (tabNum) => { currentTab = tabNum; tabButtons.forEach(btn => btn.classList.toggle('active', parseInt(btn.dataset.tab) === tabNum)); tabPanes.forEach(pane => pane.classList.toggle('hidden', parseInt(pane.id.split('-')[2]) !== tabNum)); prevBtn.classList.toggle('invisible', currentTab === 1); nextBtn.textContent = currentTab === 1 ? 'Generate Article' : 'Generate Again'; }; // --- Event Listeners --- tabButtons.forEach(button => { button.addEventListener('click', () => { const tabNum = parseInt(button.dataset.tab); if (tabNum === 2 && currentTab === 1) generatePost(); showTab(tabNum); }); }); prevBtn.addEventListener('click', () => { if (currentTab > 1) showTab(currentTab - 1) }); nextBtn.addEventListener('click', () => { if (currentTab === 1) { generatePost(); showTab(2); } else { generatePost(); } }); downloadPdfBtn.addEventListener('click', downloadPdf); // --- Initial Setup --- showTab(1); });
Scroll to Top