Personalized Cartoon Animal Sidekick Generator

Create the wacky, loyal, or grumpy companion your hero needs! Pick some traits below.

"${generatedSidekickData.catchphrase}"

`; resultsDiv.style.display = 'block'; pdfBtn.disabled = false; // Enable PDF button } // --- PDF Download Function --- function downloadPDF() { if (!generatedSidekickData || Object.keys(generatedSidekickData).length === 0) { alert("Please generate a sidekick first."); return; } if (typeof jspdf === 'undefined') { console.error("jsPDF library is not loaded."); alert("Error: PDF generation library failed to load. Please check internet or try again."); return; } const { jsPDF } = jspdf; const doc = new jsPDF(); // --- PDF Styling --- const primaryColor = '#ff7043'; // Orange const secondaryColor = '#29b6f6'; // Blue const accentColor = '#ffee58'; // Yellow const textColor = '#5d4037'; // Brown const pageMargin = 15; const lineSpacing = 7; let currentY = pageMargin; // Helper to add text and manage Y position + page breaks function addTextToPDF(text, size, color, isBold = false) { const pageHeight = doc.internal.pageSize.height; // Use a standard sans-serif font for PDF doc.setFont("helvetica", isBold ? 'bold' : 'normal'); const textLines = doc.splitTextToSize(text.replace(/|<\/span>/g, ''), doc.internal.pageSize.width - pageMargin * 2); // Strip HTML if (currentY + size / 2 > pageHeight - pageMargin) { doc.addPage(); currentY = pageMargin; } doc.setFontSize(size); doc.setTextColor(color); textLines.forEach(line => { if (currentY + lineSpacing > pageHeight - pageMargin) { doc.addPage(); currentY = pageMargin; // Re-apply font settings doc.setFont("helvetica", isBold ? 'bold' : 'normal'); doc.setFontSize(size); doc.setTextColor(color); } doc.text(line, pageMargin, currentY); currentY += lineSpacing; }); currentY += lineSpacing * 0.2; // Small buffer } function addHeadingPDF(text) { addTextToPDF(text, 14, primaryColor, true); // Orange heading currentY += lineSpacing * 0.1; } function addParagraphPDF(text) { addTextToPDF(text, 11, textColor); currentY += lineSpacing * 0.4; } // --- PDF Content --- addTextToPDF(`Cartoon Sidekick: ${generatedSidekickData.name}`, 18, primaryColor, true); currentY += lineSpacing * 1.5; addHeadingPDF("Animal Type:"); addParagraphPDF(generatedSidekickData.animalType); addHeadingPDF("Personality:"); addParagraphPDF(generatedSidekickData.personality); addHeadingPDF("Appearance:"); addParagraphPDF(generatedSidekickData.appearance); addHeadingPDF("Special Skill / Quirk:"); addParagraphPDF(generatedSidekickData.specialSkill); addHeadingPDF("Signature Accessory:"); addParagraphPDF(generatedSidekickData.signatureAccessory); addHeadingPDF("Voice:"); addParagraphPDF(generatedSidekickData.voice); addHeadingPDF("Catchphrase (Hint):"); addParagraphPDF(`"${generatedSidekickData.catchphrase}"`); // --- Save PDF --- doc.save(`cartoon_sidekick_${generatedSidekickData.name.replace(/\s+/g, '_')}.pdf`); } // --- Event Listeners --- generateBtn.addEventListener('click', generateSidekick); pdfBtn.addEventListener('click', downloadPDF); })(); // Immediately invoke the function
Scroll to Top