Meal Portion Size Calculator

Meal Portion Size Calculator

Estimate your daily needs and portion sizes based on your goals.

Tell us about yourself

Fats

Suggested Daily Portion Sizes

This table provides examples of portion sizes to help you meet your daily targets. Mix and match from each food group throughout your day.

Food Group Suggested Portions (spread across meals)
Lean Protein ~${Math.round(proteinGrams / 7)} oz cooked chicken, fish, or lean meat (approx. ${Math.round(proteinGrams / 25)} palm-sized portions)
Complex Carbs ~${(carbGrams / 25).toFixed(1)} cups cooked rice, quinoa, or pasta
Healthy Fats ~${Math.round(fatGrams / 14)} tbsp olive oil/nut butter, or ~${(fatGrams / 15).toFixed(1)} oz nuts/seeds
Vegetables 4-6 cups of leafy greens, broccoli, peppers, etc. (minimal calorie impact)
Fruits 2-3 servings (e.g., 1 medium apple, 1 cup berries)
`; } }; // --- 5. EVENT LISTENERS --- /** * Handles 'Next' button clicks. */ const handleNext = () => { if (currentTab === 0 && !validateInputs()) { return; // Stop if validation fails on the first tab } if (currentTab < tabs.length - 1) { currentTab++; // If moving to the final tab, perform calculation if (currentTab === tabs.length - 1) { calculateAndDisplayResults(); } updateUI(); } }; /** * Handles 'Previous' button clicks. */ const handlePrev = () => { if (currentTab > 0) { currentTab--; updateUI(); } }; /** * Handles PDF download functionality. */ const handlePdfDownload = () => { const { jsPDF } = window.jspdf; const contentToPrint = document.getElementById('printable-content'); const buttonContainer = document.getElementById('pdf-button-container'); if (!contentToPrint || !buttonContainer) { console.error('Printable content or button container not found.'); showError('Could not generate PDF. Please try again.'); return; } // Temporarily hide the button container so it's not in the PDF buttonContainer.classList.add('hide-for-pdf'); html2canvas(contentToPrint, { scale: 2, // Increase scale for better resolution useCORS: true, logging: false, onclone: (document) => { // This ensures styles are correctly applied in the cloned document // that html2canvas uses for rendering. } }).then(canvas => { // Restore button visibility right after capture buttonContainer.classList.remove('hide-for-pdf'); const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const canvasWidth = canvas.width; const canvasHeight = canvas.height; const ratio = canvasWidth / pdfWidth; const calculatedHeight = canvasHeight / ratio; // Check if content is taller than one page let heightLeft = calculatedHeight; let position = 0; // Add the first page pdf.addImage(imgData, 'PNG', 0, position, pdfWidth, calculatedHeight); heightLeft -= pdfHeight; // Add new pages if content overflows while (heightLeft > 0) { position -= pdfHeight; pdf.addPage(); pdf.addImage(imgData, 'PNG', 0, position, pdfWidth, calculatedHeight); heightLeft -= pdfHeight; } pdf.save('Meal_Portion_Plan.pdf'); }).catch(err => { // Ensure button is visible even if there's an error buttonContainer.classList.remove('hide-for-pdf'); console.error('PDF generation failed:', err); showError('An error occurred while generating the PDF.'); }); }; // Attach event listeners if (nextBtn) nextBtn.addEventListener('click', handleNext); if (prevBtn) prevBtn.addEventListener('click', handlePrev); if (downloadPdfBtn) downloadPdfBtn.addEventListener('click', handlePdfDownload); // --- 6. INITIALIZATION --- // Set the initial state of the UI when the script loads. updateUI(); });
Scroll to Top