Blended Risk
${analysisResults.blendedVolatility.toFixed(2)}%
Initial Investment
${formatter.format(analysisResults.initialInvestment)}
10-Year Projection
${formatter.format(analysisResults.finalValue)}
`;
};
const downloadPDF = () => {
if (!analysisResults) {
alert('Please run an analysis first.');
return;
}
const { jsPDF } = window.jspdf;
const doc = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' });
const theme = document.querySelector('input[name="theme"]:checked').value;
const colors = theme === 'classic'
? { bg: '#047857', text: '#FFFFFF', accent: '#10b981' }
: { bg: '#1d4ed8', text: '#FFFFFF', accent: '#3b82f6' };
const page = { width: doc.internal.pageSize.getWidth(), margin: 50 };
let y = 0;
// Header
doc.setFillColor(colors.bg);
doc.rect(0, 0, page.width, 80, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(20);
doc.setTextColor(colors.text);
doc.text('Multi-Asset Investment Analysis', page.margin, 50);
y = 120;
// Summary Table
doc.setFontSize(14); doc.setTextColor('#333'); doc.text('Portfolio Summary', page.margin, y); y+=20;
doc.autoTable({
startY: y, theme: 'grid', headStyles: { fillColor: colors.accent },
body: [
['Initial Investment', formatter.format(analysisResults.initialInvestment)],
['10-Year Projected Value', formatter.format(analysisResults.finalValue)],
['Blended Annual Return', `${analysisResults.blendedReturn.toFixed(2)}%`],
['Blended Volatility (Risk)', `${analysisResults.blendedVolatility.toFixed(2)}%`]
]
});
y = doc.autoTable.previous.finalY + 30;
// Allocation Table
doc.text('Portfolio Allocation', page.margin, y); y += 20;
doc.autoTable({
startY: y, theme: 'striped', headStyles: { fillColor: colors.accent },
head: [['Asset Class', 'Allocation %']],
body: analysisResults.portfolio.map(a => [a.name, `${a.allocation.toFixed(1)}%`])
});
y = doc.autoTable.previous.finalY + 20;
// Charts
if (y > doc.internal.pageSize.getHeight() - 250) { doc.addPage(); y = page.margin; }
const allocImg = charts.allocation.toBase64Image();
const projImg = charts.projection.toBase64Image();
doc.addImage(allocImg, 'PNG', page.margin, y, 200, 200);
doc.addImage(projImg, 'PNG', page.margin + 220, y, 280, 140);
doc.save(`investment-analysis-report.pdf`);
};
// --- Event Listeners ---
tabs.forEach((tab, index) => tab.addEventListener('click', () => showTab(index)));
prevBtn.addEventListener('click', () => navigateTab(-1));
nextBtn.addEventListener('click', () => navigateTab(1));
addAssetBtn.addEventListener('click', () => addAssetRow(Object.keys(ASSET_CLASSES)[0], 0));
analyzeBtn.addEventListener('click', runAnalysis);
downloadPdfBtn.addEventListener('click', downloadPDF);
// --- Initialization ---
showTab(0);
createAssumptionsUI();
addAssetRow("US Large Cap Stocks", 60);
addAssetRow("US Treasury Bonds", 40);
updateTotalAllocation();
});