Refactor code structure for improved readability and maintainability

This commit is contained in:
bolade
2025-09-24 10:36:38 +01:00
parent 845a7ca099
commit 4a61dd7898
21 changed files with 1597 additions and 1740 deletions
+358 -349
View File
@@ -4,352 +4,355 @@ from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader("report_gen"))
# Define templates and their unique contexts
pages = [
("page_1.html", {"name": "John Doe", "surname": "Moran", "date": "July 29, 2025"}),
("page_2.html", {"content": "This is page 2 content"}),
(
"page_3.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"fat_mass": "27.6lbs",
"fat_percentage": "22.4%",
"lean_mass": "95.4lbs",
"lean_percentage": "77.6%",
"body_fat_percent": "22.4%",
"age_range": "20-39",
"gender": "F",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "4",
"body_composition_chart": "../graphs/page_1_body_composition.png",
"body_fat_chart": "../graphs/page_1_body_fat.png",
},
),
(
"page_4.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "3",
},
),
(
"page_5.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"resting_calories": "1386kCals",
"fat_percentage": "33%",
"carb_percentage": "67%",
"neat_calories": "762kCals",
"weight_loss_calories": "423kCals",
"weight_loss_rate": "1.1lbs",
"total_calories": "~1725kCals",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "5",
},
),
(
"page_6.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"deficit_calories": "1725KCals",
"deficit_protein": "120g Protein",
"deficit_carbs": "155g Carbs",
"deficit_fat": "69g Fat",
"deficit_fiber": "25g Fibre",
"refeed_weekday_calories": "1615KCals",
"refeed_weekday_protein": "120g Protein",
"refeed_weekday_carbs": "142g Carbs",
"refeed_weekday_fat": "63g Fat",
"refeed_weekday_fiber": "24g Fibre",
"refeed_weekend_calories": "2000KCals",
"refeed_weekend_protein": "120g Protein",
"refeed_weekend_carbs": "190g Carbs",
"refeed_weekend_fat": "84g Fat",
"refeed_weekend_fiber": "30g Fibre",
"protein_percentage": "28%",
"carbs_percentage": "36%",
"fats_percentage": "36%",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "6",
},
),
(
"page_7.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"fvc_value": "4.24L → 112.0%",
"fev1_value": "3.26L → 103.3%",
"fev1_fvc_ratio": "76.89% → 91.8%",
"indication": "No Respiratory Capacity Limitation",
"respiratory_graph": "../graphs/respiratory_chart.png",
"peak_vt_value": "2.38L/Breath which occurs at 172bpm (Zone 3)",
"peak_vt_percentage": "73% of FEV1",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "7",
},
),
(
"page_8.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"vo2_max_value": "49.5",
"vo2_max_percentile": "100th percentile",
"age_range": "30-39",
"very_poor_range": "19.0-24.1",
"poor_range": "24.1-28.2",
"fair_range": "28.2-32.2",
"good_range": "32.2-35.7",
"excellent_range": "35.7-45.8",
"superior_range": "45.8+",
"zone1_percentage": "55-65% of Max Heart Rate",
"zone2_percentage": "65-75% of Max Heart Rate",
"zone3_percentage": "80-85% of Max Heart Rate",
"zone4_percentage": "85-88% of Max Heart Rate",
"zone5_percentage": "90% of Max Heart Rate",
"zone1_bpm": "81-96bpm",
"zone2_bpm": "96-100bpm",
"zone3_bpm": "100-178bpm",
"zone4_bpm": "178-188bpm",
"zone5_bpm": "188-198bpm",
"zone1_speed": "3.5mph",
"zone2_speed": "3.5-4.0mph",
"zone3_speed": "4.0-6.5mph",
"zone4_speed": "6.5-7.0mph",
"zone5_speed": "7.0-8.0mph",
"zone1_incline": "2% Incline",
"zone2_incline": "2% Incline",
"zone3_incline": "2% Incline",
"zone4_incline": "2% Incline",
"zone5_incline": "2% Incline",
"zone1_pace": "10:39min/km Pace",
"zone2_pace": "10:39-9:19min/km Pace",
"zone3_pace": "9:19-5:44min/km Pace",
"zone4_pace": "5:44-5:20min/km Pace",
"zone5_pace": "5:20-4:40min/km Pace",
"zone1_calories": "4.4kcals/minute",
"zone2_calories": "5.9kcals/minute",
"zone3_calories": "9.4kcals/minute",
"zone4_calories": "12.5kcals/minute",
"zone5_calories": "12.8kcals/minute",
"zone1_carb": "Avg: 0.4g/min Carb Utilization",
"zone2_carb": "Avg: 0.6g/min Carb Utilization",
"zone3_carb": "Avg: 1.9g/min Carb Utilization",
"zone4_carb": "Avg: 2.9g/min Carb Utilization",
"zone5_carb": "Avg: 3.1g/min Carb Utilization",
"zone1_breaths": "Avg: 27 breaths",
"zone2_breaths": "Avg: 28 breaths",
"zone3_breaths": "Avg: 31 breaths",
"zone4_breaths": "Avg: 42 breaths",
"zone5_breaths": "Avg: 51 breaths",
"zone1_breath_range": "Ideal Range: 15-20 breaths",
"zone2_breath_range": "Ideal Range: 20-25 breaths",
"zone3_breath_range": "Ideal Range: 25-30 breaths",
"zone4_breath_range": "Ideal Range: 30-35 breaths",
"zone5_breath_range": "Ideal Range: 40+ breaths",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "8",
},
),
(
"page_9.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"fuel_utilization_chart": "../graphs/fuel_utilization_chart.png",
"client_name": "Keirstyn Moran",
"assessment_date": "July 29 2025",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "9",
},
),
(
"page_10.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"vo2_pulse_drop_bpm": "180 bpm",
"vo2_pulse_drop_zone": "Zone 4",
"vo2_pulse_chart": "../graphs/vo2_pulse_chart.png",
"vo2_breath_drop_bpm": "173 bpm",
"vo2_breath_drop_zone": "Zone 3",
"vo2_breath_chart": "../graphs/vo2_breath_chart.png",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "9",
},
),
(
"page_11.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"fat_max_optimal": "*Optimal 10-12Kcals/minute",
"fat_max_value": "3.8Kcals/min",
"fat_max_heart_rate": "49% of Max Heart Rate",
"fat_max_bpm": "97 bpm",
"crossover_bpm": "100bpm",
"crossover_heart_rate": "51% of Max Heart Rate",
"fat_metabolism_note": "100bpm at a speed of 4.0mph and incline of 2%",
"fat_metabolism_chart": "../graphs/fat_metabolism_chart.png",
"cardiac_recovery_time": "(1 minute)",
"cardiac_recovery_percentage": "33%",
"metabolic_recovery_time": "(2 minute)",
"metabolic_recovery_percentage": "65%",
"breath_recovery_time": "(2.5 minute)",
"breath_recovery_percentage": "76%",
"recovery_chart": "../graphs/recovery_chart.png",
"resting_heart_rate": "53bpm",
"hr_age_range": "26-35",
"hr_poor": "82bpm +",
"hr_below_avg": "75-81bpm",
"hr_average": "71-74bpm",
"hr_above_avg": "66-70bpm",
"hr_good": "62-65bpm",
"hr_excellent": "55-61bpm",
"hr_athlete": "44-54bpm",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "10",
},
),
(
"page_13.html",
{
"patient_name": "Keirstyn Moran",
"age": "34",
"height": "5'4\"",
"weight": "123lbs",
"focus": "Endurance",
"zone2_frequency": "3-4x/week",
"zone2_duration": "40+ minutes",
"zone2_hr_range": "____",
"zone2_speed": "____ mph",
"zone2_incline": "2% Incline",
"zone3_frequency": "1-2x/week",
"zone3_duration": "10-20 minutes",
"zone3_hr_range": "____ bpm",
"zone3_speed": "____mph",
"zone3_incline": "2% Incline",
"zone3_target_hr": "___ bpm",
"zone3_recovery_speed": "____mph",
"zone3_recovery_incline": "2% Incline",
"zone1_hr_range": "____bpm",
"zone1_duration": "4-8 minutes",
"zone3_repeats": "2-3 times",
"short_sets": "8-10",
"short_duration": "10-30 seconds",
"short_zone": "5",
"short_rpe": "10",
"short_recovery": "20-60 seconds",
"medium_sets": "6-8",
"medium_duration": "30-90 seconds",
"medium_zone": "4",
"medium_rpe": "8-9",
"medium_recovery": "30-90 seconds",
"long_sets": "4-6",
"long_duration": "5-10 minutes",
"long_zone": "3/4",
"long_rpe": "7-8",
"long_recovery": "2.5-5 minutes",
"tempo_sets": "2-3",
"tempo_duration": "10-20 minutes",
"tempo_zone": "3",
"tempo_rpe": "6-7",
"tempo_recovery": "4-8 minutes",
"cardio_sets": "1",
"cardio_duration": ">40 minutes",
"cardio_zone": "2",
"cardio_rpe": "4-5",
"cardio_recovery": "N/A",
"week1_mon_zone": "Zone 2",
"week1_mon_duration": "45 mins",
"week1_tue_zone": "Zone 2",
"week1_tue_duration": "45 mins",
"week1_wed_zone": "Zone 3",
"week1_wed_duration1": "10mins On",
"week1_wed_duration2": "8mins Rest",
"week1_wed_sets": "x2",
"week1_thu_content": "",
"week1_fri_zone": "Zone 2",
"week1_fri_duration": "45 mins",
"week1_sat_content": "",
"week1_sun_content": "",
"week2_mon_zone": "Zone 2",
"week2_mon_duration": "50 mins",
"week2_tue_zone": "Zone 2",
"week2_tue_duration": "50 mins",
"week2_wed_zone": "Zone 3",
"week2_wed_duration1": "10mins On",
"week2_wed_duration2": "6mins Rest",
"week2_wed_sets": "x2",
"week2_thu_content": "",
"week2_fri_zone": "Zone 2",
"week2_fri_duration": "50 mins",
"week2_sat_content": "",
"week2_sun_content": "",
"contact_email": "info@ishplabs.com",
"website": "www.ishplabs.com",
"social": "@ishplabs",
"page_number": "12",
},
),
("page_14.html", {}),
("page_15.html", {}),
("page_16.html", {}),
("page_17.html", {}),
("page_18.html", {}),
("page_19.html", {}),
]
# pages = [
# ("page_1.html", {"name": "John Doe", "surname": "Moran", "date": "July 29, 2025"}),
# ("page_2.html", {"content": "This is page 2 content"}),
# (
# "page_3.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "fat_mass": "27.6lbs",
# "fat_percentage": "22.4%",
# "lean_mass": "95.4lbs",
# "lean_percentage": "77.6%",
# "body_fat_percent": "22.4%",
# "age_range": "20-39",
# "gender": "F",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "4",
# "body_composition_chart": "../graphs/page_1_body_composition.png",
# "body_fat_chart": "../graphs/page_1_body_fat.png",
# },
# ),
# (
# "page_4.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "3",
# },
# ),
# (
# "page_5.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "resting_calories": "1386kCals",
# "fat_percentage": "33%",
# "carb_percentage": "67%",
# "neat_calories": "762kCals",
# "weight_loss_calories": "423kCals",
# "weight_loss_rate": "1.1lbs",
# "total_calories": "~1725kCals",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "5",
# },
# ),
# (
# "page_6.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "deficit_calories": "1725KCals",
# "deficit_protein": "120g Protein",
# "deficit_carbs": "155g Carbs",
# "deficit_fat": "69g Fat",
# "deficit_fiber": "25g Fibre",
# "refeed_weekday_calories": "1615KCals",
# "refeed_weekday_protein": "120g Protein",
# "refeed_weekday_carbs": "142g Carbs",
# "refeed_weekday_fat": "63g Fat",
# "refeed_weekday_fiber": "24g Fibre",
# "refeed_weekend_calories": "2000KCals",
# "refeed_weekend_protein": "120g Protein",
# "refeed_weekend_carbs": "190g Carbs",
# "refeed_weekend_fat": "84g Fat",
# "refeed_weekend_fiber": "30g Fibre",
# "protein_percentage": "28%",
# "carbs_percentage": "36%",
# "fats_percentage": "36%",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "6",
# },
# ),
# (
# "page_7.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "fvc_value": "4.24L → 112.0%",
# "fev1_value": "3.26L → 103.3%",
# "fev1_fvc_ratio": "76.89% → 91.8%",
# "indication": "No Respiratory Capacity Limitation",
# "respiratory_graph": "../graphs/respiratory_chart.png",
# "peak_vt_value": "2.38L/Breath which occurs at 172bpm (Zone 3)",
# "peak_vt_percentage": "73% of FEV1",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "7",
# },
# ),
# (
# "page_8.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "vo2_max_value": "49.5",
# "vo2_max_percentile": "100th percentile",
# "age_range": "30-39",
# "very_poor_range": "19.0-24.1",
# "poor_range": "24.1-28.2",
# "fair_range": "28.2-32.2",
# "good_range": "32.2-35.7",
# "excellent_range": "35.7-45.8",
# "superior_range": "45.8+",
# "zone1_percentage": "55-65% of Max Heart Rate",
# "zone2_percentage": "65-75% of Max Heart Rate",
# "zone3_percentage": "80-85% of Max Heart Rate",
# "zone4_percentage": "85-88% of Max Heart Rate",
# "zone5_percentage": "90% of Max Heart Rate",
# "zone1_bpm": "81-96bpm",
# "zone2_bpm": "96-100bpm",
# "zone3_bpm": "100-178bpm",
# "zone4_bpm": "178-188bpm",
# "zone5_bpm": "188-198bpm",
# "zone1_speed": "3.5mph",
# "zone2_speed": "3.5-4.0mph",
# "zone3_speed": "4.0-6.5mph",
# "zone4_speed": "6.5-7.0mph",
# "zone5_speed": "7.0-8.0mph",
# "zone1_incline": "2% Incline",
# "zone2_incline": "2% Incline",
# "zone3_incline": "2% Incline",
# "zone4_incline": "2% Incline",
# "zone5_incline": "2% Incline",
# "zone1_pace": "10:39min/km Pace",
# "zone2_pace": "10:39-9:19min/km Pace",
# "zone3_pace": "9:19-5:44min/km Pace",
# "zone4_pace": "5:44-5:20min/km Pace",
# "zone5_pace": "5:20-4:40min/km Pace",
# "zone1_calories": "4.4kcals/minute",
# "zone2_calories": "5.9kcals/minute",
# "zone3_calories": "9.4kcals/minute",
# "zone4_calories": "12.5kcals/minute",
# "zone5_calories": "12.8kcals/minute",
# "zone1_carb": "Avg: 0.4g/min Carb Utilization",
# "zone2_carb": "Avg: 0.6g/min Carb Utilization",
# "zone3_carb": "Avg: 1.9g/min Carb Utilization",
# "zone4_carb": "Avg: 2.9g/min Carb Utilization",
# "zone5_carb": "Avg: 3.1g/min Carb Utilization",
# "zone1_breaths": "Avg: 27 breaths",
# "zone2_breaths": "Avg: 28 breaths",
# "zone3_breaths": "Avg: 31 breaths",
# "zone4_breaths": "Avg: 42 breaths",
# "zone5_breaths": "Avg: 51 breaths",
# "zone1_breath_range": "Ideal Range: 15-20 breaths",
# "zone2_breath_range": "Ideal Range: 20-25 breaths",
# "zone3_breath_range": "Ideal Range: 25-30 breaths",
# "zone4_breath_range": "Ideal Range: 30-35 breaths",
# "zone5_breath_range": "Ideal Range: 40+ breaths",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "8",
# },
# ),
# (
# "page_9.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "fuel_utilization_chart": "../graphs/fuel_utilization_chart.png",
# "client_name": "Keirstyn Moran",
# "assessment_date": "July 29 2025",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "9",
# },
# ),
# (
# "page_10.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "vo2_pulse_drop_bpm": "180 bpm",
# "vo2_pulse_drop_zone": "Zone 4",
# "vo2_pulse_chart": "../graphs/vo2_pulse_chart.png",
# "vo2_breath_drop_bpm": "173 bpm",
# "vo2_breath_drop_zone": "Zone 3",
# "vo2_breath_chart": "../graphs/vo2_breath_chart.png",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "9",
# },
# ),
# (
# "page_11.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "fat_max_optimal": "*Optimal 10-12Kcals/minute",
# "fat_max_value": "3.8Kcals/min",
# "fat_max_heart_rate": "49% of Max Heart Rate",
# "fat_max_bpm": "97 bpm",
# "crossover_bpm": "100bpm",
# "crossover_heart_rate": "51% of Max Heart Rate",
# "fat_metabolism_note": "100bpm at a speed of 4.0mph and incline of 2%",
# "fat_metabolism_chart": "../graphs/fat_metabolism_chart.png",
# "cardiac_recovery_time": "(1 minute)",
# "cardiac_recovery_percentage": "33%",
# "metabolic_recovery_time": "(2 minute)",
# "metabolic_recovery_percentage": "65%",
# "breath_recovery_time": "(2.5 minute)",
# "breath_recovery_percentage": "76%",
# "recovery_chart": "../graphs/recovery_chart.png",
# "resting_heart_rate": "53bpm",
# "hr_age_range": "26-35",
# "hr_poor": "82bpm +",
# "hr_below_avg": "75-81bpm",
# "hr_average": "71-74bpm",
# "hr_above_avg": "66-70bpm",
# "hr_good": "62-65bpm",
# "hr_excellent": "55-61bpm",
# "hr_athlete": "44-54bpm",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "10",
# },
# ),
# (
# "page_13.html",
# {
# "patient_name": "Keirstyn Moran",
# "age": "34",
# "height": "5'4\"",
# "weight": "123lbs",
# "focus": "Endurance",
# "zone2_frequency": "3-4x/week",
# "zone2_duration": "40+ minutes",
# "zone2_hr_range": "____",
# "zone2_speed": "____ mph",
# "zone2_incline": "2% Incline",
# "zone3_frequency": "1-2x/week",
# "zone3_duration": "10-20 minutes",
# "zone3_hr_range": "____ bpm",
# "zone3_speed": "____mph",
# "zone3_incline": "2% Incline",
# "zone3_target_hr": "___ bpm",
# "zone3_recovery_speed": "____mph",
# "zone3_recovery_incline": "2% Incline",
# "zone1_hr_range": "____bpm",
# "zone1_duration": "4-8 minutes",
# "zone3_repeats": "2-3 times",
# "short_sets": "8-10",
# "short_duration": "10-30 seconds",
# "short_zone": "5",
# "short_rpe": "10",
# "short_recovery": "20-60 seconds",
# "medium_sets": "6-8",
# "medium_duration": "30-90 seconds",
# "medium_zone": "4",
# "medium_rpe": "8-9",
# "medium_recovery": "30-90 seconds",
# "long_sets": "4-6",
# "long_duration": "5-10 minutes",
# "long_zone": "3/4",
# "long_rpe": "7-8",
# "long_recovery": "2.5-5 minutes",
# "tempo_sets": "2-3",
# "tempo_duration": "10-20 minutes",
# "tempo_zone": "3",
# "tempo_rpe": "6-7",
# "tempo_recovery": "4-8 minutes",
# "cardio_sets": "1",
# "cardio_duration": ">40 minutes",
# "cardio_zone": "2",
# "cardio_rpe": "4-5",
# "cardio_recovery": "N/A",
# "week1_mon_zone": "Zone 2",
# "week1_mon_duration": "45 mins",
# "week1_tue_zone": "Zone 2",
# "week1_tue_duration": "45 mins",
# "week1_wed_zone": "Zone 3",
# "week1_wed_duration1": "10mins On",
# "week1_wed_duration2": "8mins Rest",
# "week1_wed_sets": "x2",
# "week1_thu_content": "",
# "week1_fri_zone": "Zone 2",
# "week1_fri_duration": "45 mins",
# "week1_sat_content": "",
# "week1_sun_content": "",
# "week2_mon_zone": "Zone 2",
# "week2_mon_duration": "50 mins",
# "week2_tue_zone": "Zone 2",
# "week2_tue_duration": "50 mins",
# "week2_wed_zone": "Zone 3",
# "week2_wed_duration1": "10mins On",
# "week2_wed_duration2": "6mins Rest",
# "week2_wed_sets": "x2",
# "week2_thu_content": "",
# "week2_fri_zone": "Zone 2",
# "week2_fri_duration": "50 mins",
# "week2_sat_content": "",
# "week2_sun_content": "",
# "contact_email": "info@ishplabs.com",
# "website": "www.ishplabs.com",
# "social": "@ishplabs",
# "page_number": "12",
# },
# ),
# ("page_14.html", {}),
# ("page_15.html", {}),
# ("page_16.html", {}),
# ("page_17.html", {}),
# ("page_18.html", {}),
# ("page_19.html", {}),
# ]
pages = [
(f"page_{i}.html", {}) for i in range(1, 20)
]
# Render each template with its own context
html_pages = []
for tpl, ctx in pages:
@@ -367,9 +370,14 @@ html_doc = f"""
<meta charset="utf-8">
<link href="https://cdn.jsdelivr.net/npm/tailwindcss/dist/tailwind.min.css" rel="stylesheet">
<style>
html, body {{
height: 100%;
margin: 0;
padding: 0;
}}
.page-break {{ page-break-after: always; }}
.page {{
height: 386mm;
height: 100%;
}}
</style>
</head>
@@ -379,10 +387,11 @@ html_doc = f"""
</html>
"""
print(html_doc)
# Generate PDF
options = {
"page-size": "A4",
# "page-size": "A4",
'page-height': '297mm',
'page-width': '210mm',
"encoding": "UTF-8",
"margin-top": "0mm",
"margin-bottom": "0mm",
@@ -390,6 +399,6 @@ options = {
"margin-right": "0mm",
"no-outline": None,
}
pdfkit.from_string(html_doc, "multi_page_report.pdf", options=options)
pdfkit.from_string(html_doc, "truth_report.pdf", options=options)
print("✅ PDF generated: multi_page_report.pdf")
-1
View File
@@ -1,6 +1,5 @@
<div
class="w-full page bg-black text-white relative overflow-hidden"
style="height: 297mm"
>
<!-- ISHP Logo/Text -->
<div class="absolute top-8 left-8 z-20">
+3 -3
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
@@ -26,7 +26,7 @@
<!-- VO2 Pulse Graph -->
<div class="flex justify-center mb-6">
<img src="{{ vo2_pulse_chart | default('../graphs/vo2_pulse_chart.png') }}"
<img src="{{ vo2_pulse_chart }}"
alt="VO2 Pulse Chart"
class="w-full max-w-4xl h-auto object-contain">
</div>
@@ -42,7 +42,7 @@
<!-- VO2 Breath Graph -->
<div class="flex justify-center mb-6">
<img src="{{ vo2_breath_chart | default('../graphs/vo2_breath_chart.png') }}"
<img src="{{ vo2_breath_chart }}"
alt="VO2 Breath Chart"
class="w-full max-w-4xl h-auto object-contain">
</div>
+3 -3
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm">
<div class="w-full page bg-white">
<!-- Header Section -->
<div
class="bg-black text-white px-6 py-4 flex items-center justify-between"
@@ -71,7 +71,7 @@
<div class="flex justify-center">
<img
src="{{ fat_metabolism_chart | default('../graphs/fat_metabolism_chart.png') }}"
src="{{ fat_metabolism_chart }}"
alt="Fat Metabolism Chart"
class="w-full max-w-4xl h-auto object-contain"
/>
@@ -130,7 +130,7 @@
<!-- Recovery Graph -->
<div class="flex justify-center mb-6">
<img
src="{{ recovery_chart | default('../graphs/recovery_chart.png') }}"
src="{{ recovery_chart }}"
alt="Recovery Chart"
class="w-full max-w-4xl h-auto object-contain"
/>
+3
View File
@@ -0,0 +1,3 @@
<div class="page" id="page-12">
This is page 12
</div>
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
+161 -169
View File
@@ -1,173 +1,165 @@
<body class="bg-white font-sans">
<!-- Header -->
<div class="bg-black text-white p-4 flex items-center justify-between">
<div class="flex items-center space-x-4">
<div class="text-xl font-bold">ISHP</div>
<div class="w-8 h-6 bg-teal-400"></div>
<!-- Header -->
<div class="w-full page">
<div class="bg-black text-white p-4 flex items-center justify-between">
<div class="flex items-center space-x-4">
<div class="text-xl font-bold">ISHP</div>
<div class="w-8 h-6 bg-teal-400"></div>
</div>
<div class="text-sm">
<span class="mr-6">Name: Keirstyn Moran</span>
<span class="mr-6">Age: 34</span>
<span class="mr-6">Height: 5'4"</span>
<span class="mr-6">Weight: 123lbs</span>
<span>Focus: Endurance</span>
</div>
</div>
<!-- Main Content -->
<div class="p-8">
<h1 class="text-4xl font-bold mb-8">Glossary</h1>
<div class="space-y-6 text-sm leading-relaxed">
<!-- Peak VT -->
<div>
<p class="font-semibold">Peak VT:</p>
<p class="mb-2">
Peak Volume of air moved throughout the test.
</p>
<p class="mb-2">
Respiratory Capability Limitations that can be found
include:
</p>
<ul class="list-disc ml-6 space-y-1">
<li>
<strong>Endurance:</strong> Normal capacity, but cannot
maintain their VT over time.
</li>
<li>
<strong>Strength/Power:</strong> Normal capacity, but
peak VT is not 75-85% of their FEV1 despite FEV1 being
normal
</li>
<li>
<strong>Coordination (Hyper/Hypo-Ventilation):</strong>
Normal capacity, but uses low volumes +/- high BFs at
lower intensities. A breathing coordination limitation
can also be identified by the loss of volume at higher
intensities, which are then recovered upon recovery/stop
of activity.
</li>
</ul>
</div>
<div class="text-sm">
<span class="mr-6">Name: Keirstyn Moran</span>
<span class="mr-6">Age: 34</span>
<span class="mr-6">Height: 5'4"</span>
<span class="mr-6">Weight: 123lbs</span>
<span>Focus: Endurance</span>
<!-- VO2 Pulse -->
<div>
<p class="font-semibold">VO2 Pulse:</p>
<p>
VO2 Pulse refers to the relationship between oxygen
consumption (VO2) and heart rate (HR) during exercise. This
measure gives insight into how efficiently the body is using
oxygen in relation to the heart's output. A higher VO2 Pulse
suggests that an individual is able to deliver oxygen more
efficiently to the muscles with each heartbeat.
</p>
</div>
<!-- VO2 Breath -->
<div>
<p class="font-semibold">VO2 Breath:</p>
<p>
VO2 Breath refers to the amount of oxygen consumed per
breath during exercise, which indicates how effectively the
body delivers oxygen to the bloodstream through the lungs
with each breath. A more efficient VO2 Breath means the body
requires less effort to obtain the same amount of oxygen,
indicating better respiratory efficiency and oxygen
utilization.
</p>
</div>
<!-- Carb & Fat Crossover -->
<div>
<p class="font-semibold">Carb & Fat Crossover:</p>
<p class="mb-2">
The point during exercise at which the body shifts its
predominant fuel source from fats to carbohydrates. This
transition typically occurs as exercise intensity increases,
and marks the transition from Zone 2 into Zone 3. As
exercise intensity increases, the body starts to rely more
on carbohydrates because they provide faster energy.
</p>
<p>
Endurance training (e.g., long, steady-state cardio within
Zones 1 & 2) increases the body's ability to burn fat
efficiently at higher intensities, shifting the crossover
point to a faster speed, or higher heart rate/intensity.
Because fat stores are much larger and can provide a steady
stream of energy for prolonged periods, a higher CHO/FAT
crossover can help delay fatigue, which is especially
beneficial in longer-duration events, where carbohydrate
depletion can lead to a significant drop in performance.
</p>
</div>
<!-- Cardiovascular Recovery -->
<div>
<p class="font-semibold">Cardiovascular Recovery:</p>
<p>
The percentage your heart rate drops within the first minute
of the inactive recovery phase in relation to the lowest
heart rate recorded prior to the start of the test.
</p>
</div>
<!-- Metabolic (CO2) Recovery -->
<div>
<p class="font-semibold">Metabolic (CO2) Recovery:</p>
<p class="mb-2">
The percentage that your VCO2 levels (amount of CO2 you are
exhaling) drop within the first 1.5 minutes of the inactive
recovery phase in relation to the lowest VCO2 recorded prior
to the start of the test.
</p>
<p>
refers to the rate at which the body clears carbon dioxide
(CO2) after exercise, reflecting the efficiency of the
cardiovascular and respiratory systems in returning CO2
levels to baseline. A faster VCO2 recovery indicates
effective management of metabolic byproducts, signaling a
healthier metabolic system and lower risk of metabolic
disorders.
</p>
</div>
<!-- Breath Frequency Recovery -->
<div>
<p class="font-semibold">Breath Frequency Recovery:</p>
<p>
Refers to the speed at which the body returns to a normal
breathing rate after physical exertion. Faster breath
frequency recovery indicates a well-conditioned
cardiovascular and respiratory system, allowing the body to
efficiently regulate oxygen and CO2 levels. It supports
better endurance, faster recovery between intervals, and the
ability to sustain higher performance during repeated
efforts or prolonged activity. Additionally, a quick return
to baseline signals that the autonomic nervous system is
functioning well, reducing stress on the body and promoting
more efficient recovery. This also reflects a healthier
metabolic system, better management of metabolic byproducts
like CO2, and a lower risk of chronic conditions.
</p>
</div>
</div>
</div>
<!-- Main Content -->
<div class="p-8">
<h1 class="text-4xl font-bold mb-8">Glossary</h1>
<div class="space-y-6 text-sm leading-relaxed">
<!-- Peak VT -->
<div>
<p class="font-semibold">Peak VT:</p>
<p class="mb-2">
Peak Volume of air moved throughout the test.
</p>
<p class="mb-2">
Respiratory Capability Limitations that can be found
include:
</p>
<ul class="list-disc ml-6 space-y-1">
<li>
<strong>Endurance:</strong> Normal capacity, but
cannot maintain their VT over time.
</li>
<li>
<strong>Strength/Power:</strong> Normal capacity,
but peak VT is not 75-85% of their FEV1 despite FEV1
being normal
</li>
<li>
<strong
>Coordination (Hyper/Hypo-Ventilation):</strong
>
Normal capacity, but uses low volumes +/- high BFs
at lower intensities. A breathing coordination
limitation can also be identified by the loss of
volume at higher intensities, which are then
recovered upon recovery/stop of activity.
</li>
</ul>
</div>
<!-- VO2 Pulse -->
<div>
<p class="font-semibold">VO2 Pulse:</p>
<p>
VO2 Pulse refers to the relationship between oxygen
consumption (VO2) and heart rate (HR) during exercise.
This measure gives insight into how efficiently the body
is using oxygen in relation to the heart's output. A
higher VO2 Pulse suggests that an individual is able to
deliver oxygen more efficiently to the muscles with each
heartbeat.
</p>
</div>
<!-- VO2 Breath -->
<div>
<p class="font-semibold">VO2 Breath:</p>
<p>
VO2 Breath refers to the amount of oxygen consumed per
breath during exercise, which indicates how effectively
the body delivers oxygen to the bloodstream through the
lungs with each breath. A more efficient VO2 Breath
means the body requires less effort to obtain the same
amount of oxygen, indicating better respiratory
efficiency and oxygen utilization.
</p>
</div>
<!-- Carb & Fat Crossover -->
<div>
<p class="font-semibold">Carb & Fat Crossover:</p>
<p class="mb-2">
The point during exercise at which the body shifts its
predominant fuel source from fats to carbohydrates. This
transition typically occurs as exercise intensity
increases, and marks the transition from Zone 2 into
Zone 3. As exercise intensity increases, the body starts
to rely more on carbohydrates because they provide
faster energy.
</p>
<p>
Endurance training (e.g., long, steady-state cardio
within Zones 1 & 2) increases the body's ability to burn
fat efficiently at higher intensities, shifting the
crossover point to a faster speed, or higher heart
rate/intensity. Because fat stores are much larger and
can provide a steady stream of energy for prolonged
periods, a higher CHO/FAT crossover can help delay
fatigue, which is especially beneficial in
longer-duration events, where carbohydrate depletion can
lead to a significant drop in performance.
</p>
</div>
<!-- Cardiovascular Recovery -->
<div>
<p class="font-semibold">Cardiovascular Recovery:</p>
<p>
The percentage your heart rate drops within the first
minute of the inactive recovery phase in relation to the
lowest heart rate recorded prior to the start of the
test.
</p>
</div>
<!-- Metabolic (CO2) Recovery -->
<div>
<p class="font-semibold">Metabolic (CO2) Recovery:</p>
<p class="mb-2">
The percentage that your VCO2 levels (amount of CO2 you
are exhaling) drop within the first 1.5 minutes of the
inactive recovery phase in relation to the lowest VCO2
recorded prior to the start of the test.
</p>
<p>
refers to the rate at which the body clears carbon
dioxide (CO2) after exercise, reflecting the efficiency
of the cardiovascular and respiratory systems in
returning CO2 levels to baseline. A faster VCO2 recovery
indicates effective management of metabolic byproducts,
signaling a healthier metabolic system and lower risk of
metabolic disorders.
</p>
</div>
<!-- Breath Frequency Recovery -->
<div>
<p class="font-semibold">Breath Frequency Recovery:</p>
<p>
Refers to the speed at which the body returns to a
normal breathing rate after physical exertion. Faster
breath frequency recovery indicates a well-conditioned
cardiovascular and respiratory system, allowing the body
to efficiently regulate oxygen and CO2 levels. It
supports better endurance, faster recovery between
intervals, and the ability to sustain higher performance
during repeated efforts or prolonged activity.
Additionally, a quick return to baseline signals that
the autonomic nervous system is functioning well,
reducing stress on the body and promoting more efficient
recovery. This also reflects a healthier metabolic
system, better management of metabolic byproducts like
CO2, and a lower risk of chronic conditions.
</p>
</div>
</div>
</div>
<!-- Footer -->
<div
class="bg-black text-white p-4 flex justify-between items-center text-sm mt-8"
>
<div>CONTACT: info@ishplabs.com</div>
<div>WEBSITE: www.ishplabs.com</div>
<div>SOCIAL: @ishplabs</div>
<div class="bg-white text-black px-3 py-1 font-bold">17</div>
</div>
</body>
</html>
<!-- Footer -->
<div
class="bg-black text-white p-4 flex justify-between items-center text-sm mt-8"
>
<div>CONTACT: info@ishplabs.com</div>
<div>WEBSITE: www.ishplabs.com</div>
<div>SOCIAL: @ishplabs</div>
<div class="bg-white text-black px-3 py-1 font-bold">17</div>
</div>
</div>
+218 -353
View File
@@ -1,371 +1,236 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Glossary - Page 18</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-white font-sans">
<!-- Header -->
<div class="bg-black text-white p-4 flex items-center justify-between">
<div class="flex items-center space-x-4">
<div class="text-xl font-bold">ISHP</div>
<div class="w-8 h-6 bg-teal-400"></div>
</div>
<div class="text-sm">
<span class="mr-6">Name: Keirstyn Moran</span>
<span class="mr-6">Age: 34</span>
<span class="mr-6">Height: 5'4"</span>
<span class="mr-6">Weight: 123lbs</span>
<span>Focus: Endurance</span>
</div>
<div class="w-full page">
<div class="bg-black text-white p-4 flex items-center justify-between">
<div class="flex items-center space-x-4">
<div class="text-xl font-bold">ISHP</div>
<div class="w-8 h-6 bg-teal-400"></div>
</div>
<div class="text-sm">
<span class="mr-6">Name: Keirstyn Moran</span>
<span class="mr-6">Age: 34</span>
<span class="mr-6">Height: 5'4"</span>
<span class="mr-6">Weight: 123lbs</span>
<span>Focus: Endurance</span>
</div>
</div>
<!-- Main Content -->
<div class="p-8">
<h1 class="text-4xl font-bold mb-8">Glossary</h1>
<!-- Local Muscle Activity/SMO2 Definition -->
<div class="mb-12 text-sm leading-relaxed">
<p class="font-semibold mb-2">Local Muscle Activity/SMO2:</p>
<p>
SmO2 testing is a valuable tool for understanding how muscles
respond to various physiological stressors and how to fine-tune
training, nutrition and hydration accordingly. Monitoring
changes in tissue oxygen saturation and utilization helps
identify an individual's optimal intensity to work at, as well
as how well they recover between bouts of intensity. This can
help optimize training to improve performance, prevent
overtraining, and tailor strategies for better results.
</p>
<p>
During competitions, athletes can also use SmO2 data to pace
themselves effectively. Adjusting intensity based on muscle
oxygenation can help prevent premature fatigue and optimize race
outcomes
</p>
</div>
<!-- Main Content -->
<div class="p-8">
<h1 class="text-4xl font-bold mb-8">Glossary</h1>
<!-- Body Fat Percent Master Chart -->
<div class="mb-8">
<h2 class="text-2xl font-bold mb-6 text-center">
Body Fat Percent Master Chart
</h2>
<!-- Local Muscle Activity/SMO2 Definition -->
<div class="mb-12 text-sm leading-relaxed">
<p class="font-semibold mb-2">Local Muscle Activity/SMO2:</p>
<p>
SmO2 testing is a valuable tool for understanding how
muscles respond to various physiological stressors and how
to fine-tune training, nutrition and hydration accordingly.
Monitoring changes in tissue oxygen saturation and
utilization helps identify an individual's optimal intensity
to work at, as well as how well they recover between bouts
of intensity. This can help optimize training to improve
performance, prevent overtraining, and tailor strategies for
better results.
</p>
<p>
During competitions, athletes can also use SmO2 data to pace
themselves effectively. Adjusting intensity based on muscle
oxygenation can help prevent premature fatigue and optimize
race outcomes
</p>
</div>
<!-- Body Fat Percent Master Chart -->
<!-- Male Chart -->
<div class="mb-8">
<h2 class="text-2xl font-bold mb-6 text-center">
Body Fat Percent Master Chart
</h2>
<!-- Male Chart -->
<div class="mb-8">
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium">
Age (M)
</div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 20-39 row -->
<div
class="bg-red-300 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
20-39
</div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-green-300 border border-gray-300"
></div>
<div
class="bg-green-400 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
</div>
</div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium"></div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 40-59 row -->
<div
class="bg-yellow-300 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
40-59
</div>
<div
class="bg-green-300 border border-gray-300"
></div>
<div
class="bg-green-400 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
</div>
</div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium"></div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 60-79 row -->
<div
class="bg-yellow-300 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
60-79
</div>
<div
class="bg-green-300 border border-gray-300"
></div>
<div
class="bg-green-400 border border-gray-300"
></div>
<div
class="bg-green-400 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
</div>
</div>
<!-- Percentage labels for male chart -->
<div class="flex items-center">
<div class="w-20 mr-4"></div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium">Age (M)</div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 20-39 row -->
<div
class="flex-1 grid grid-cols-11 gap-0 text-xs text-center font-medium"
class="bg-red-300 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
<div>0%</div>
<div>5%</div>
<div>10%</div>
<div>15%</div>
<div>20%</div>
<div>25%</div>
<div>30%</div>
<div>35%</div>
<div>40%</div>
<div>45%</div>
<div>50%</div>
20-39
</div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-green-300 border border-gray-300"></div>
<div class="bg-green-400 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
</div>
</div>
<!-- Female Chart -->
<div class="mb-8">
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium">
Age (F)
</div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 20-39 row -->
<div
class="bg-red-300 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
20-39
</div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-green-300 border border-gray-300"
></div>
<div
class="bg-green-400 border border-gray-300"
></div>
<div
class="bg-green-300 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
</div>
</div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium"></div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 40-59 row -->
<div
class="bg-red-400 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
40-59
</div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-green-300 border border-gray-300"
></div>
<div
class="bg-green-400 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
</div>
</div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium"></div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 60-79 row -->
<div
class="bg-red-400 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
60-79
</div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-green-300 border border-gray-300"
></div>
<div
class="bg-green-400 border border-gray-300"
></div>
<div
class="bg-yellow-300 border border-gray-300"
></div>
<div
class="bg-red-300 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
<div
class="bg-red-400 border border-gray-300"
></div>
</div>
</div>
<!-- Percentage labels for female chart -->
<div class="flex items-center">
<div class="w-20 mr-4"></div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium"></div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 40-59 row -->
<div
class="flex-1 grid grid-cols-11 gap-0 text-xs text-center font-medium"
class="bg-yellow-300 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
<div>0%</div>
<div>5%</div>
<div>10%</div>
<div>15%</div>
<div>20%</div>
<div>25%</div>
<div>30%</div>
<div>35%</div>
<div>40%</div>
<div>45%</div>
<div>50%</div>
40-59
</div>
<div class="bg-green-300 border border-gray-300"></div>
<div class="bg-green-400 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
</div>
</div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium"></div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 60-79 row -->
<div
class="bg-yellow-300 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
60-79
</div>
<div class="bg-green-300 border border-gray-300"></div>
<div class="bg-green-400 border border-gray-300"></div>
<div class="bg-green-400 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
</div>
</div>
<!-- Percentage labels for male chart -->
<div class="flex items-center">
<div class="w-20 mr-4"></div>
<div
class="flex-1 grid grid-cols-11 gap-0 text-xs text-center font-medium"
>
<div>0%</div>
<div>5%</div>
<div>10%</div>
<div>15%</div>
<div>20%</div>
<div>25%</div>
<div>30%</div>
<div>35%</div>
<div>40%</div>
<div>45%</div>
<div>50%</div>
</div>
</div>
</div>
<!-- Female Chart -->
<div class="mb-8">
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium">Age (F)</div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 20-39 row -->
<div
class="bg-red-300 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
20-39
</div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-green-300 border border-gray-300"></div>
<div class="bg-green-400 border border-gray-300"></div>
<div class="bg-green-300 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
</div>
</div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium"></div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 40-59 row -->
<div
class="bg-red-400 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
40-59
</div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-green-300 border border-gray-300"></div>
<div class="bg-green-400 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
</div>
</div>
<div class="flex items-center mb-4">
<div class="w-20 text-right mr-4 font-medium"></div>
<div class="flex-1 grid grid-cols-11 gap-0 h-20">
<!-- Age 60-79 row -->
<div
class="bg-red-400 border border-gray-300 flex items-center justify-center text-xs font-medium"
>
60-79
</div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-green-300 border border-gray-300"></div>
<div class="bg-green-400 border border-gray-300"></div>
<div class="bg-yellow-300 border border-gray-300"></div>
<div class="bg-red-300 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
<div class="bg-red-400 border border-gray-300"></div>
</div>
</div>
<!-- Percentage labels for female chart -->
<div class="flex items-center">
<div class="w-20 mr-4"></div>
<div
class="flex-1 grid grid-cols-11 gap-0 text-xs text-center font-medium"
>
<div>0%</div>
<div>5%</div>
<div>10%</div>
<div>15%</div>
<div>20%</div>
<div>25%</div>
<div>30%</div>
<div>35%</div>
<div>40%</div>
<div>45%</div>
<div>50%</div>
</div>
</div>
</div>
</div>
</div>
<!-- Footer -->
<div
class="bg-black text-white p-4 flex justify-between items-center text-sm"
>
<div>CONTACT: info@ishplabs.com</div>
<div>WEBSITE: www.ishplabs.com</div>
<div>SOCIAL: @ishplabs</div>
<div class="bg-white text-black px-3 py-1 font-bold">18</div>
</div>
</body>
</html>
<!-- Footer -->
<div
class="bg-black text-white p-4 flex justify-between items-center text-sm"
>
<div>CONTACT: info@ishplabs.com</div>
<div>WEBSITE: www.ishplabs.com</div>
<div>SOCIAL: @ishplabs</div>
<div class="bg-white text-black px-3 py-1 font-bold">18</div>
</div>
</div>
+835 -846
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="bg-white w-full page m-0 p-0" style="height: 297mm">
<div class="bg-white w-full page m-0 p-0">
<div class="px-16 py-20">
<!-- Table of Contents Header -->
<div class="mb-12">
+3 -3
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
@@ -30,7 +30,7 @@
<!-- Body Composition Chart -->
<div class="flex justify-center mb-8">
<div class="relative">
<img src="{{ body_composition_chart | default('../graphs/page_1_body_composition.png') }}"
<img src="{{ body_composition_chart}}"
alt="Body Composition Chart"
class="w-80 h-80 object-contain">
@@ -53,7 +53,7 @@
<!-- Body Fat Chart -->
<div class="flex justify-center">
<img src="{{ body_fat_chart | default('../graphs/page_1_body_fat.png') }}"
<img src="{{ body_fat_chart}}"
alt="Body Fat Percentage Chart"
class="w-full max-w-2xl h-32 object-contain">
</div>
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
+2 -2
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
@@ -150,7 +150,7 @@
<!-- Respiratory Graph -->
<div class="flex justify-center mb-4">
<img src="{{ respiratory_graph | default('../graphs/respiratory_chart.png') }}"
<img src="{{ respiratory_graph }}"
alt="Respiratory Analysis Chart"
class="w-full max-w-4xl h-64 object-contain">
</div>
+1 -1
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
+2 -2
View File
@@ -1,4 +1,4 @@
<div class="w-full page bg-white" style="height: 297mm;"></div>
<div class="w-full page bg-white">
<!-- Header Section -->
<div class="bg-black text-white px-6 py-4 flex items-center justify-between">
<div class="flex items-center">
@@ -18,7 +18,7 @@
<div class="px-8 py-12 flex flex-col items-center justify-center h-full">
<!-- Fuel Utilization Chart -->
<div class="w-full max-w-5xl">
<img src="{{ fuel_utilization_chart | default('../graphs/fuel_utilization_chart.png') }}"
<img src="{{ fuel_utilization_chart }}"
alt="Fuel Utilization Report - Institute of Science, Health and Performance"
class="w-full h-auto object-contain">
</div>
BIN
View File
Binary file not shown.