Biological Age Calculator
Biological Age Calculator | Healthspan Formulas /* Reset and base styles */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --primary: #2c3e50; --secondary: #3498db; --accent: #16a085; --light: #ecf0f1; --dark: #2c3e50; --danger: #e74c3c; --warning: #f39c12; --success: #27ae60; } /* Calculator container styles */ .bio-age-calculator { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; max-width: 800px; margin: 2rem auto; background-color: white; border-radius: 10px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); overflow: hidden; } .calculator-header { background-color: var(--primary); color: white; padding: 1.5rem; text-align: center; } .calculator-header h2 { font-size: 1.8rem; margin-bottom: 0.5rem; } .calculator-header p { font-size: 1rem; opacity: 0.9; } /* Progress bar */ .progress-container { padding: 1rem 1.5rem; background-color: var(--light); } .progress-bar { height: 8px; background-color: #e0e0e0; border-radius: 4px; overflow: hidden; } .progress { height: 100%; background-color: var(--accent); width: 0%; transition: width 0.3s ease; } /* Form content */ .calculator-content { padding: 1.5rem; } .form-step { display: none; } .form-step.active { display: block; animation: fadeIn 0.5s; } .form-step h3 { color: var(--primary); margin-bottom: 1.5rem; font-size: 1.4rem; } .form-group { margin-bottom: 1.5rem; } .form-group label { display: block; margin-bottom: 0.5rem; color: var(--dark); font-weight: 500; } .form-control { width: 100%; padding: 0.8rem; border: 1px solid #ddd; border-radius: 4px; font-size: 1rem; transition: border-color 0.3s; } .form-control:focus { outline: none; border-color: var(--secondary); } .radio-group { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 0.5rem; } .radio-option { flex: 1; min-width: 120px; } .radio-option input[type="radio"] { display: none; } .radio-option label { display: block; padding: 0.8rem; text-align: center; background-color: var(--light); border-radius: 4px; cursor: pointer; transition: all 0.3s; } .radio-option input[type="radio"]:checked + label { background-color: var(--secondary); color: white; } .range-control { width: 100%; } .range-values { display: flex; justify-content: space-between; margin-top: 0.5rem; color: var(--dark); font-size: 0.9rem; } /* Buttons */ .btn-container { display: flex; justify-content: space-between; margin-top: 2rem; } .btn { padding: 0.8rem 1.5rem; border: none; border-radius: 4px; font-size: 1rem; cursor: pointer; transition: all 0.3s; } .btn-prev { background-color: var(--light); color: var(--dark); } .btn-next, .btn-submit { background-color: var(--accent); color: white; } .btn:hover { opacity: 0.9; transform: translateY(-2px); } /* Results section */ .results-container { display: none; padding: 2rem; text-align: center; } .age-comparison { display: flex; justify-content: space-around; margin: 2rem 0; gap: 2rem; } .age-card { flex: 1; padding: 1.5rem; border-radius: 8px; box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1); } .age-card.chronological { background-color: var(--light); } .age-card.biological { background-color: var(--secondary); color: white; } .age-card h4 { font-size: 1.2rem; margin-bottom: 1rem; } .age-value { font-size: 2.5rem; font-weight: bold; } .age-unit { font-size: 1.2rem; margin-left: 0.2rem; } .insights { margin: 2rem 0; text-align: left; } .insights h3 { margin-bottom: 1rem; color: var(--primary); } .insight-item { display: flex; align-items: center; margin-bottom: 1rem; padding: 1rem; background-color: var(--light); border-radius: 6px; } .insight-icon { font-size: 1.5rem; margin-right: 1rem; color: var(--accent); } /* Recommendations section */ .recommendations { margin-top: 2rem; } .recommendations h3 { margin-bottom: 1.5rem; color: var(--primary); } .product-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1.5rem; margin-top: 1.5rem; } .product-card { border: 1px solid #eee; border-radius: 8px; overflow: hidden; transition: transform 0.3s, box-shadow 0.3s; } .product-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); } .product-image { width: 100%; height: 180px; object-fit: cover; } .product-info { padding: 1rem; } .product-title { font-size: 1rem; margin-bottom: 0.5rem; color: var(--dark); } .product-btn { display: block; width: 100%; padding: 0.8rem; background-color: var(--accent); color: white; text-align: center; text-decoration: none; border-radius: 4px; margin-top: 1rem; transition: background-color 0.3s; } .product-btn:hover { background-color: #107a65; } /* Animations */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* Responsiveness */ @media (max-width: 768px) { .bio-age-calculator { margin: 1rem; border-radius: 8px; } .age-comparison { flex-direction: column; gap: 1rem; } .product-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); } }
Biological Age Calculator
Discover your true biological age based on lifestyle, sleep, exercise, and biomarkers
Basic Information
Age (years)
Gender
Male
Female
Other
Do you smoke?
Yes
Occasionally
No
Alcohol consumption
None
Light
Moderate
Heavy
Next
Sleep Patterns
Average sleep duration (hours per night)
3 hours 7 hours 12 hours
Sleep quality
Excellent
Good
Fair
Poor
Do you regularly have trouble falling asleep?
Yes
Sometimes
No
Previous Next
Exercise Habits
How often do you exercise per week?
Never
1-2 times
3-4 times
5+ times
Exercise intensity
Low
Moderate
High
Do you incorporate strength training?
Yes
Sometimes
No
Previous Next
Diet & Nutrition
How would you rate your overall diet?
Excellent
Good
Fair
Poor
How many portions of fruits and vegetables do you eat daily?
0-1
2-3
4-5
6+
Do you take supplements regularly?
Yes
Sometimes
No
Previous Next
Stress & Mental Wellbeing
How would you rate your stress levels?
Low
Moderate
High
Very High
Do you practice mindfulness or meditation?
Regularly
Occasionally
Never
How satisfied are you with your work-life balance?
Very Satisfied
Somewhat
Not Satisfied
Previous Next
Basic Biomarkers (Optional)
These fields are optional. If you know your measurements, please enter them for a more accurate calculation.
Blood Pressure (mmHg)
Resting Heart Rate (bpm)
Fasting Blood Glucose (mmol/L)
Previous Calculate My Age
Your Age Results
Chronological Age
36 years
Biological Age
33 years
Your Health Insights
Recommended Products for You
Based on your results, these supplements may help optimise your biological age:
Start Over
(function() { // Create isolated scope for calculator to avoid conflicts with Shopify function initBioAgeCalculator() { // Product database const products = [ { id: 'nmn', name: 'Nicotinamide Mononucleotide (NMN)', url: 'https://healthspanformulas.co.uk/products/nmn', image: 'https://cdn.shopify.com/s/files/1/0949/2863/4194/files/Untitled_design_69.png?v=1741030949', tags: ['energy', 'aging', 'sleep', 'mitochondria'] }, { id: 'nmn-complex', name: 'NMN & TMG Complex', url: 'https://healthspanformulas.co.uk/products/nmn-complex', image: 'https://cdn.shopify.com/s/files/1/0949/2863/4194/files/Untitleddesign_70.png?v=1741031058', tags: ['energy', 'aging', 'sleep', 'mitochondria', 'methylation'] }, { id: 'resveratrol', name: 'Resveratrol', url: 'https://healthspanformulas.co.uk/products/resveratrol', image: 'https://cdn.shopify.com/s/files/1/0949/2863/4194/files/Untitleddesign_71.png?v=1741031245', tags: ['aging', 'antioxidant', 'cardiovascular'] }, { id: 'alpha-lipoic-acid', name: 'Alpha Lipoic Acid', url: 'https://healthspanformulas.co.uk/products/alpha-lipoic-acid', image: 'https://cdn.shopify.com/s/files/1/0949/2863/4194/files/Untitleddesign_72.png?v=1741033237', tags: ['antioxidant', 'mitochondria', 'energy', 'glucose'] }, { id: 'longevity-bundle', name: 'Longevity Essentials Bundle', url: 'https://healthspanformulas.co.uk/products/longevity-essentials-bundle', image: 'https://cdn.shopify.com/s/files/1/0949/2863/4194/files/mockup-of-a-man-s-hand-holding-a-box-against-a-solid-surface-m32438.png?v=1741612079', tags: ['aging', 'longevity', 'complete', 'energy', 'mitochondria'] }, { id: 'coq10', name: 'Co-Q10 Supplement (300mg)', url: 'https://healthspanformulas.co.uk/products/co-q10-300mg', image: 'https://cdn.shopify.com/s/files/1/0949/2863/4194/files/Screenshot2025-03-13at16.37.27.png?v=1741883865', tags: ['energy', 'heart', 'mitochondria', 'cardiovascular'] }, { id: 'mitochondrial-bundle', name: 'Mitochondrial Health Bundle', url: 'https://healthspanformulas.co.uk/products/mitochondrial-health-bundle', image: 'https://cdn.shopify.com/s/files/1/0949/2863/4194/files/Screenshot2025-03-13at16.54.38.png?v=1741885426', tags: ['energy', 'mitochondria', 'complete'] }, { id: 'magnesium', name: 'Magnesium Complex', url: 'https://healthspanformulas.co.uk/products/magnesium-complex', image: 'https://cdn.shopify.com/s/files/1/0949/2863/4194/files/Screenshot2025-03-15at16.47.00.png?v=1742314919', tags: ['sleep', 'stress', 'muscle', 'relaxation'] } ]; // DOM Elements const form = document.getElementById('bioAgeForm'); const formSteps = document.querySelectorAll('.form-step'); const progressBar = document.getElementById('progress'); const sleepDuration = document.getElementById('sleep-duration'); const sleepValue = document.getElementById('sleep-value'); const submitButton = document.querySelector('.btn-submit'); const resultsContainer = document.getElementById('results'); const chronologicalAgeDisplay = document.getElementById('chronological-age'); const biologicalAgeDisplay = document.getElementById('biological-age'); const insightsContainer = document.getElementById('insights-container'); const productRecommendations = document.getElementById('product-recommendations'); const resetButton = document.getElementById('reset-calculator'); let currentStep = 1; const totalSteps = formSteps.length; // Update progress bar function updateProgress() { const progressPercentage = ((currentStep - 1) / (totalSteps - 1)) * 100; progressBar.style.width = `${progressPercentage}%`; } // Next and Submit button click handlers document.querySelectorAll('.btn-next, .btn-submit').forEach(button => { button.addEventListener('click', function() { // Don't proceed if required fields aren't filled const activeStep = document.querySelector(`.form-step[data-step="${currentStep}"]`); const requiredFields = activeStep.querySelectorAll('[required]'); let canProceed = true; requiredFields.forEach(field => { if (field.type === 'radio') { const name = field.name; const checked = activeStep.querySelector(`input[name="${name}"]:checked`); if (!checked) canProceed = false; } else if (!field.value) { canProceed = false; } }); if (!canProceed && this.classList.contains('btn-submit') === false) { alert('Please fill in all required fields.'); return; } if (this.classList.contains('btn-submit')) { calculateBiologicalAge(); } else if (currentStep < totalSteps) { document.querySelector(`.form-step[data-step="${currentStep}"]`).classList.remove('active'); currentStep++; document.querySelector(`.form-step[data-step="${currentStep}"]`).classList.add('active'); updateProgress(); } }); }); // Previous button click handler document.querySelectorAll('.btn-prev').forEach(button => { button.addEventListener('click', function() { if (currentStep > 1) { document.querySelector(`.form-step[data-step="${currentStep}"]`).classList.remove('active'); currentStep--; document.querySelector(`.form-step[data-step="${currentStep}"]`).classList.add('active'); updateProgress(); } }); }); // Sleep duration slider sleepDuration.addEventListener('input', function() { sleepValue.textContent = `${this.value} hours`; }); // Reset calculator resetButton.addEventListener('click', function() { form.reset(); resultsContainer.style.display = 'none'; document.querySelector(`.form-step[data-step="1"]`).classList.add('active'); currentStep = 1; updateProgress(); }); // Calculate biological age function calculateBiologicalAge() { // Get chronological age const chronologicalAge = parseInt(document.getElementById('age').value); // Calculate factors that affect biological age let ageDelta = 0; // Smoking impact const smoking = document.querySelector('input[name="smoke"]:checked').value; if (smoking === 'yes') { ageDelta += 5; } else if (smoking === 'occasionally') { ageDelta += 2; } // Alcohol impact const alcohol = document.querySelector('input[name="alcohol"]:checked').value; if (alcohol === 'heavy') { ageDelta += 4; } else if (alcohol === 'moderate') { ageDelta += 1; } else if (alcohol === 'none') { ageDelta -= 1; } // Sleep impact const sleepDurationValue = parseFloat(sleepDuration.value); if (sleepDurationValue < 6) { ageDelta += 2; } else if (sleepDurationValue >= 7 && sleepDurationValue <= 8) { ageDelta -= 1; } const sleepQuality = document.querySelector('input[name="sleep-quality"]:checked').value; if (sleepQuality === 'poor') { ageDelta += 2; } else if (sleepQuality === 'excellent') { ageDelta -= 1; } // Exercise impact const exerciseFrequency = document.querySelector('input[name="exercise-frequency"]:checked').value; if (exerciseFrequency === 'never') { ageDelta += 3; } else if (exerciseFrequency === '1-2') { ageDelta += 1; } else if (exerciseFrequency === '3-4') { ageDelta -= 1; } else if (exerciseFrequency === '5+') { ageDelta -= 2; } const exerciseIntensity = document.querySelector('input[name="exercise-intensity"]:checked').value; if (exerciseIntensity === 'high') { ageDelta -= 1; } else if (exerciseIntensity === 'low' && exerciseFrequency !== 'never') { ageDelta += 0.5; } // Diet impact const dietQuality = document.querySelector('input[name="diet-quality"]:checked').value; if (dietQuality === 'poor') { ageDelta += 3; } else if (dietQuality === 'excellent') { ageDelta -= 2; } const vegetableIntake = document.querySelector('input[name="vegetables"]:checked').value; if (vegetableIntake === '0-1') { ageDelta += 1; } else if (vegetableIntake === '4-5' || vegetableIntake === '6+') { ageDelta -= 1; } // Stress impact const stressLevel = document.querySelector('input[name="stress"]:checked').value; if (stressLevel === 'high' || stressLevel === 'very-high') { ageDelta += 2; } else if (stressLevel === 'low') { ageDelta -= 1; } // Mindfulness impact const mindfulness = document.querySelector('input[name="mindfulness"]:checked').value; if (mindfulness === 'regularly') { ageDelta -= 1; } // Biomarkers impact (optional) const bloodPressure = document.getElementById('blood-pressure').value; if (bloodPressure) { const parts = bloodPressure.split('/'); if (parts.length === 2) { const systolic = parseInt(parts[0]); const diastolic = parseInt(parts[1]); if (systolic >= 140 || diastolic >= 90) { ageDelta += 2; } else if (systolic <= 115 && diastolic <= 75) { ageDelta -= 1; } } } const heartRate = document.getElementById('resting-heart-rate').value; if (heartRate) { if (parseInt(heartRate) > 80) { ageDelta += 1; } else if (parseInt(heartRate) < 60) { ageDelta -= 1; } } const glucose = document.getElementById('glucose').value; if (glucose) { if (parseFloat(glucose) > 6) { ageDelta += 2; } else if (parseFloat(glucose) < 5) { ageDelta -= 0.5; } } // Calculate final biological age let biologicalAge = Math.max(18, Math.round(chronologicalAge + ageDelta)); // Update the display chronologicalAgeDisplay.textContent = chronologicalAge; biologicalAgeDisplay.textContent = biologicalAge; // Generate insights generateInsights(chronologicalAge, biologicalAge, ageDelta); // Recommend products recommendProducts(); // Show results document.querySelectorAll('.form-step').forEach(step => { step.classList.remove('active'); }); resultsContainer.style.display = 'block'; } // Generate health insights based on results function generateInsights(chronologicalAge, biologicalAge, ageDelta) { insightsContainer.innerHTML = ''; const insights = []; // Age comparison insight if (biologicalAge < chronologicalAge) { insights.push({ text: `Your biological age is ${chronologicalAge - biologicalAge} years younger than your chronological age. Keep up the good work!`, icon: '👏' }); } else if (biologicalAge > chronologicalAge) { insights.push({ text: `Your biological age is ${biologicalAge - chronologicalAge} years older than your chronological age. There's room for improvement.`, icon: '📈' }); } else { insights.push({ text: `Your biological age matches your chronological age. There's potential to improve this with lifestyle changes.`, icon: '⚖️' }); } // Lifestyle-specific insights const smoking = document.querySelector('input[name="smoke"]:checked').value; if (smoking === 'yes') { insights.push({ text: 'Quitting smoking could significantly reduce your biological age and improve overall health.', icon: '🚭' }); } const alcohol = document.querySelector('input[name="alcohol"]:checked').value; if (alcohol === 'heavy' || alcohol === 'moderate') { insights.push({ text: 'Reducing alcohol consumption could improve your biological age and support cellular health.', icon: '🍷' }); } const sleep = document.querySelector('input[name="sleep-quality"]:checked').value; const sleepDurationValue = parseFloat(sleepDuration.value); if (sleep === 'poor' || sleepDurationValue < 6) { insights.push({ text: 'Improving sleep quality and duration could significantly lower your biological age.', icon: '😴' }); } const exercise = document.querySelector('input[name="exercise-frequency"]:checked').value; if (exercise === 'never' || exercise === '1-2') { insights.push({ text: 'Increasing regular exercise could reduce your biological age and improve cellular function.', icon: '🏃' }); } const diet = document.querySelector('input[name="diet-quality"]:checked').value; if (diet === 'poor' || diet === 'fair') { insights.push({ text: 'Improving diet quality with more whole foods could lower your biological age.', icon: '🥗' }); } const stress = document.querySelector('input[name="stress"]:checked').value; if (stress === 'high' || stress === 'very-high') { insights.push({ text: 'Reducing stress levels could help lower your biological age and support cellular repair.', icon: '🧘' }); } // Biomarker-specific insights const glucose = document.getElementById('glucose').value; if (glucose && parseFloat(glucose) > 6) { insights.push({ text: 'Your blood glucose is elevated. Managing this could improve your biological age and metabolic health.', icon: '📊' }); } // Add insights to the container insights.forEach(insight => { const insightElement = document.createElement('div'); insightElement.className = 'insight-item'; insightElement.innerHTML = ` ${insight.icon} ${insight.text} `; insightsContainer.appendChild(insightElement); }); } // Recommend products based on results function recommendProducts() { productRecommendations.innerHTML = ''; const recommendations = []; const userTags = []; // Generate tags based on user's responses const sleep = document.querySelector('input[name="sleep-quality"]:checked').value; const sleepDurationValue = parseFloat(sleepDuration.value); if (sleep === 'poor' || sleepDurationValue < 6) { userTags.push('sleep'); } const exercise = document.querySelector('input[name="exercise-frequency"]:checked').value; const exerciseIntensity = document.querySelector('input[name="exercise-intensity"]:checked').value; if (exercise === 'never' || exercise === '1-2' || exerciseIntensity === 'low') { userTags.push('energy'); } const stress = document.querySelector('input[name="stress"]:checked').value; if (stress === 'high' || stress === 'very-high') { userTags.push('stress'); } const chronologicalAge = parseInt(document.getElementById('age').value); if (chronologicalAge > 40) { userTags.push('aging'); } const biologicalAge = parseInt(document.getElementById('biological-age').textContent); if (biologicalAge > chronologicalAge) { userTags.push('aging', 'longevity'); } const glucose = document.getElementById('glucose').value; if (glucose && parseFloat(glucose) > 6) { userTags.push('glucose'); } const bloodPressure = document.getElementById('blood-pressure').value; if (bloodPressure) { const parts = bloodPressure.split('/'); if (parts.length === 2) { const systolic = parseInt(parts[0]); const diastolic = parseInt(parts[1]); if (systolic >= 140 || diastolic >= 90) { userTags.push('cardiovascular'); } } } // Always recommend mitochondrial health products userTags.push('mitochondria'); // Match products based on tags products.forEach(product => { let score = 0; userTags.forEach(tag => { if (product.tags.includes(tag)) { score++; } }); if (score > 0) { recommendations.push({ product: product, score: score }); } }); // Sort by relevance score recommendations.sort((a, b) => b.score - a.score); // Take top 3 or 4 const topRecommendations = recommendations.slice(0, Math.min(4, recommendations.length)); // Add recommendations to the container topRecommendations.forEach(rec => { const productElement = document.createElement('div'); productElement.className = 'product-card'; productElement.innerHTML = `