CAPTION:
${generatedSceneData.caption}
DIALOGUE:
${generatedSceneData.dialogue[0].char}: "${generatedSceneData.dialogue[0].line}"
${generatedSceneData.dialogue[1].char}: "${generatedSceneData.dialogue[1].line}"
SFX:
${generatedSceneData.sfx || "None"}
`;
resultsDiv.style.display = 'block';
pdfBtn.disabled = false;
}
// --- PDF Download Function ---
function downloadPDF() {
if (!generatedSceneData || !generatedSceneData.panelDesc) {
alert("Please generate a scene first.");
return;
}
// Ensure jsPDF is loaded
if (typeof jspdf === 'undefined' || typeof jspdf.jsPDF === 'undefined') {
console.error("jsPDF library or jsPDF constructor is not loaded correctly.");
alert("Error: PDF generation library failed to load. Please check internet connection or Elementor setup.");
return;
}
const { jsPDF } = jspdf;
const doc = new jsPDF();
// --- PDF Styling ---
const primaryColor = '#ffb300'; // Yellow
const secondaryColor = '#00acc1'; // Teal
const accentColor = '#f44336'; // Red
const textColor = '#33334d'; // Dark Indigo Text
const pageMargin = 15;
const lineSpacing = 6; // Tighter for script
let currentY = pageMargin;
const pageHeight = doc.internal.pageSize.height;
const pageWidth = doc.internal.pageSize.width;
const indent = pageMargin + 10;
const dialogueIndent = indent + 25;
const charIndent = indent; // Align char name with general indent
// Helper to add text with page breaks
function addTextToPDF(text, size, color, style = 'normal', xPos = pageMargin) {
// Use Courier for script feel in PDF
try { doc.setFont("courier", style); } catch(e) { doc.setFont("helvetica", style); } // Fallback
doc.setFontSize(size);
doc.setTextColor(color);
const splitText = doc.splitTextToSize(text, pageWidth - xPos - pageMargin);
splitText.forEach(line => {
if (currentY + lineSpacing > pageHeight - pageMargin) {
doc.addPage();
currentY = pageMargin;
// Reset font on new page
try { doc.setFont("courier", style); } catch(e) { doc.setFont("helvetica", style); }
doc.setFontSize(size);
doc.setTextColor(color);
}
doc.text(line, xPos, currentY);
currentY += lineSpacing;
});
}
function addHeadingPDF(text) {
// Use UI font (Helvetica fallback) for headings in PDF for clarity
try { doc.setFont("helvetica", "bold"); } catch(e) { /* ignore */ }
addTextToPDF(text.toUpperCase() + ":", 11, secondaryColor, 'bold', pageMargin);
currentY += lineSpacing * 0.1;
}
function addParagraphPDF(text, xPos = indent) {
addTextToPDF(text, 10, textColor, 'normal', xPos);
currentY += lineSpacing * 0.3;
}
// --- PDF Content ---
try { doc.setFont("helvetica", "bold"); } catch(e) { /* ignore */ }
addTextToPDF("Retro Sci-Fi Comic Scene Prompt", 16, primaryColor, 'bold');
currentY += lineSpacing * 1.5;
addHeadingPDF("Panel Description");
addParagraphPDF(generatedSceneData.panelDesc);
if (generatedSceneData.keywordNote) {
addTextToPDF(generatedSceneData.keywordNote, 9, secondaryColor, 'italic', indent);
currentY += lineSpacing * 0.2;
}
addHeadingPDF("Caption");
addTextToPDF(generatedSceneData.caption, 10, textColor, 'italic', indent);
currentY += lineSpacing * 0.7;
addHeadingPDF("Dialogue");
addTextToPDF(generatedSceneData.dialogue[0].char + ":", 10, textColor, 'bold', charIndent);
addParagraphPDF(`"${generatedSceneData.dialogue[0].line}"`, dialogueIndent);
addTextToPDF(generatedSceneData.dialogue[1].char + ":", 10, textColor, 'bold', charIndent);
addParagraphPDF(`"${generatedSceneData.dialogue[1].line}"`, dialogueIndent);
addHeadingPDF("SFX");
addTextToPDF(generatedSceneData.sfx || "None", 10, accentColor, 'bold', indent);
// --- Save PDF ---
doc.save('retro_comic_scene_prompt.pdf');
}
// --- Event Listeners ---
if (generateBtn) {
generateBtn.addEventListener('click', generateScene);
} else {
console.error("Generate button not found! Check ID: comic-generate-btn-a9b4f");
}
if (pdfBtn) {
pdfBtn.addEventListener('click', downloadPDF);
} else {
console.error("PDF button not found! Check ID: comic-pdf-btn-a9b4f");
}
})(); // Immediately invoke the function