Recommendation:
${recommendation}
`;
}
async function generatePdf() {
const { jsPDF } = window.jspdf;
const doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });
const { enduranceHold, quickReps, score, recommendation } = testResults;
// --- PDF Styling & Content ---
const primaryColor = '#0d9488';
const textColor = '#374151';
const lightTextColor = '#6b7280';
// Header
doc.setFont('Inter', 'bold');
doc.setFontSize(24);
doc.setTextColor(primaryColor);
doc.text('Pelvic Floor Strength Assessment', 105, 25, { align: 'center' });
doc.setFont('Inter', 'normal');
doc.setFontSize(12);
doc.setTextColor(lightTextColor);
doc.text(`Date of Assessment: ${new Date().toLocaleDateString('en-US')}`, 105, 33, { align: 'center' });
doc.setLineWidth(0.5);
doc.setDrawColor(primaryColor);
doc.line(20, 42, 190, 42);
// Results Section
let startY = 60;
doc.setFont('Inter', 'bold');
doc.setFontSize(18);
doc.setTextColor(primaryColor);
doc.text('Test Results', 20, startY);
doc.line(20, startY + 3, 60, startY + 3);
const resultsData = [
['Endurance Hold:', `${enduranceHold} seconds (Goal: 10s)`],
['Quick Repetitions:', `${quickReps} reps (Goal: 10 reps)`]
];
startY += 15;
doc.setFontSize(12);
resultsData.forEach(([label, value]) => {
doc.setFillColor(240, 253, 250); // teal-50
doc.rect(20, startY - 7, 170, 10, 'F');
doc.setFont('Inter', 'bold');
doc.setTextColor(textColor);
doc.text(label, 25, startY);
doc.setFont('Inter', 'normal');
doc.setTextColor(lightTextColor);
doc.text(value, 90, startY);
startY += 15;
});
// Overall Assessment
startY += 10;
doc.setFont('Inter', 'bold');
doc.setFontSize(18);
doc.setTextColor(primaryColor);
doc.text('Overall Assessment', 20, startY);
doc.line(20, startY + 3, 80, startY + 3);
startY += 15;
doc.setFont('Inter', 'bold');
doc.setFontSize(14);
doc.setTextColor(textColor);
doc.text('Assessed Level:', 25, startY);
doc.setFont('Inter', 'normal');
doc.setFontSize(16);
doc.setTextColor(primaryColor);
doc.text(score, 70, startY);
// Recommendation
startY += 20;
doc.setFont('Inter', 'bold');
doc.setFontSize(18);
doc.setTextColor(primaryColor);
doc.text('Recommendation', 20, startY);
doc.line(20, startY + 3, 75, startY + 3);
startY += 12;
doc.setFont('Inter', 'normal');
doc.setFontSize(12);
doc.setTextColor(textColor);
doc.text(recommendation, 25, startY, { maxWidth: 160 });
// Footer
doc.setLineWidth(0.2);
doc.setDrawColor('#d1d5db'); // gray-300
doc.line(20, 270, 190, 270);
doc.setFontSize(9);
doc.setTextColor('#9ca3af'); // gray-400
doc.text('This self-assessment is for informational purposes and is not a substitute for a diagnosis or treatment plan from a qualified healthcare or physiotherapy professional.', 105, 278, { align: 'center', maxWidth: 170 });
// --- Save PDF ---
doc.save('Pelvic_Floor_Assessment_Report.pdf');
}
// --- Event Listeners ---
Object.keys(tabs).forEach(tabName => {
if (tabs[tabName]) {
tabs[tabName].addEventListener('click', () => {
// Prevent clicking to results if test not done
if (tabName === 'results' && testResults.enduranceHold === 0) {
alert("Please complete the test before viewing results.");
return;
}
setActiveTab(tabName);
});
}
});
if (nav.next) nav.next.addEventListener('click', () => navigate(1));
if (nav.prev) nav.prev.addEventListener('click', () => navigate(-1));
if (testElements.startBtn) testElements.startBtn.addEventListener('click', handleTestButtonClick);
if (downloadPdfBtn) downloadPdfBtn.addEventListener('click', generatePdf);
// Initial setup
setActiveTab('instructions');
});