Interactive vital signs selector with clinical notes per age group

Replace static vital signs table with interactive age group dropdown.
Each selection shows: HR (awake/sleeping), RR, SBP, DBP, temperature,
SpO2 target, weight range, and age-specific clinical notes.

10 age groups: preterm through 18 years. Values from Harriet Lane
Handbook 23rd Edition. Includes AAP 2017 BP classification thresholds
for ages 13+, ETT sizing formulas, and clinical pearls (orthostatic
testing, febrile tachycardia, athletic bradycardia, etc.).

Full reference table preserved as collapsible "View All Age Groups".
This commit is contained in:
Daniel 2026-04-11 04:19:39 +02:00
parent 64546a743d
commit 0630e460e8
2 changed files with 244 additions and 27 deletions

View file

@ -419,36 +419,54 @@
<div class="card">
<div class="card-header">
<h3><i class="fas fa-heartbeat"></i> Normal Vital Signs by Age</h3>
<span style="font-size:11px;color:var(--g500);">Harriet Lane Handbook</span>
<span style="font-size:11px;color:var(--g500);">Harriet Lane Handbook, 23rd Edition</span>
</div>
<div style="padding:16px;">
<p style="font-size:12px;color:var(--g500);margin:0 0 14px;">Reference ranges for heart rate, respiratory rate, and blood pressure by age. Source: Harriet Lane Handbook.</p>
<div style="overflow-x:auto;">
<table class="admin-table" style="font-size:12px;width:100%;">
<thead>
<tr>
<th>Age</th>
<th>Heart Rate (bpm)</th>
<th>Respiratory Rate</th>
<th>Systolic BP (mmHg)</th>
<th>Diastolic BP (mmHg)</th>
<th>Weight (kg)</th>
</tr>
</thead>
<tbody>
<tr><td>Preterm</td><td>120-170</td><td>40-70</td><td>55-75</td><td>35-45</td><td>1-2.5</td></tr>
<tr><td>Newborn (0-1mo)</td><td>100-160</td><td>30-60</td><td>60-80</td><td>35-55</td><td>2.5-4.5</td></tr>
<tr><td>1-6 months</td><td>100-150</td><td>30-50</td><td>70-90</td><td>40-60</td><td>4-8</td></tr>
<tr><td>6-12 months</td><td>90-140</td><td>25-40</td><td>75-95</td><td>45-65</td><td>8-10</td></tr>
<tr><td>1-3 years</td><td>80-130</td><td>20-30</td><td>80-100</td><td>50-70</td><td>10-15</td></tr>
<tr><td>4-5 years</td><td>80-120</td><td>20-25</td><td>85-105</td><td>50-70</td><td>15-20</td></tr>
<tr><td>6-8 years</td><td>70-115</td><td>18-25</td><td>90-110</td><td>55-75</td><td>20-27</td></tr>
<tr><td>9-11 years</td><td>70-110</td><td>16-22</td><td>95-115</td><td>58-78</td><td>27-40</td></tr>
<tr><td>12-15 years</td><td>60-100</td><td>14-20</td><td>100-125</td><td>60-80</td><td>40-60</td></tr>
<tr><td>16-18 years</td><td>55-95</td><td>12-18</td><td>110-130</td><td>65-85</td><td>55-75</td></tr>
</tbody>
</table>
<p style="font-size:12px;color:var(--g500);margin:0 0 14px;">Select age group to view normal vital sign ranges. Source: Harriet Lane Handbook, 23rd Ed. (Johns Hopkins).</p>
<div class="calc-field" style="max-width:300px;margin-bottom:16px;">
<label>Age Group</label>
<select id="vitals-age-select">
<option value="">Select age group</option>
<option value="preterm">Preterm (&lt;37 weeks)</option>
<option value="newborn">Newborn (0-28 days)</option>
<option value="1-6mo">1-6 months</option>
<option value="6-12mo">6-12 months</option>
<option value="1-3yr">1-3 years</option>
<option value="4-5yr">4-5 years</option>
<option value="6-9yr">6-9 years</option>
<option value="10-12yr">10-12 years</option>
<option value="13-15yr">13-15 years</option>
<option value="16-18yr">16-18 years</option>
</select>
</div>
<div id="vitals-result" class="hidden"></div>
<!-- All ages reference table (collapsible) -->
<details style="margin-top:16px;border:1px solid var(--g200);border-radius:8px;">
<summary style="padding:10px 14px;cursor:pointer;font-weight:600;font-size:13px;color:var(--g700);background:var(--g50);border-radius:8px;">View All Age Groups</summary>
<div style="padding:12px;overflow-x:auto;">
<table class="admin-table" style="font-size:12px;width:100%;">
<thead>
<tr><th>Age</th><th>HR (bpm)</th><th>RR</th><th>SBP (mmHg)</th><th>DBP (mmHg)</th><th>Temp (C)</th></tr>
</thead>
<tbody>
<tr><td>Preterm</td><td>120-170</td><td>40-70</td><td>55-75</td><td>35-45</td><td>36.5-37.5</td></tr>
<tr><td>Newborn</td><td>100-165</td><td>30-60</td><td>60-80</td><td>35-55</td><td>36.5-37.5</td></tr>
<tr><td>1-6 mo</td><td>100-150</td><td>30-53</td><td>70-90</td><td>40-63</td><td>36.5-37.5</td></tr>
<tr><td>6-12 mo</td><td>80-140</td><td>25-40</td><td>72-95</td><td>40-65</td><td>36.0-37.5</td></tr>
<tr><td>1-3 yr</td><td>80-130</td><td>20-30</td><td>80-105</td><td>45-70</td><td>36.0-37.5</td></tr>
<tr><td>4-5 yr</td><td>75-120</td><td>20-25</td><td>85-108</td><td>48-70</td><td>36.0-37.5</td></tr>
<tr><td>6-9 yr</td><td>70-115</td><td>18-24</td><td>88-115</td><td>50-75</td><td>36.0-37.5</td></tr>
<tr><td>10-12 yr</td><td>65-110</td><td>16-22</td><td>95-120</td><td>55-78</td><td>36.0-37.5</td></tr>
<tr><td>13-15 yr</td><td>60-100</td><td>14-20</td><td>100-128</td><td>58-80</td><td>36.0-37.5</td></tr>
<tr><td>16-18 yr</td><td>55-95</td><td>12-18</td><td>105-135</td><td>60-85</td><td>36.0-37.5</td></tr>
</tbody>
</table>
</div>
</details>
<div style="margin-top:16px;">
<h4 style="font-size:13px;font-weight:700;color:var(--g700);margin:0 0 8px;">Quick Reference Formulas</h4>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;">

View file

@ -1427,5 +1427,204 @@
document.getElementById('bili-result').classList.add('hidden');
var bc = document.getElementById('bili-chart-container'); if (bc) bc.classList.add('hidden');
});
// ═══════════════════════════════════════════════════════════
// VITAL SIGNS — Interactive age selector
// Harriet Lane Handbook 23rd Edition reference values
// ═══════════════════════════════════════════════════════════
var VITALS_DATA = {
preterm: {
label: 'Preterm (<37 weeks GA)',
hr: { awake: '120-170', sleeping: '100-150' },
rr: '40-70',
sbp: '55-75', dbp: '35-45',
temp: '36.5-37.5',
weight: '0.5-2.5 kg',
spo2: '88-95% (target)',
notes: [
'HR and RR are highly variable and depend on gestational age',
'BP increases with gestational age and postnatal age',
'Target SpO2 88-95% to reduce retinopathy of prematurity risk',
'Temperature instability is common — use servo-controlled warmers',
'Bradycardia (<100 bpm) and apnea are common in premature infants'
]
},
newborn: {
label: 'Newborn (0-28 days)',
hr: { awake: '100-165', sleeping: '90-145' },
rr: '30-60',
sbp: '60-80', dbp: '35-55',
temp: '36.5-37.5',
weight: '2.5-4.5 kg',
spo2: '>95%',
notes: [
'HR normally increases with crying (up to 180-190 bpm) — this is physiologic',
'Periodic breathing (pauses <10 sec) is normal in newborns',
'Acrocyanosis (blue hands/feet) is normal; central cyanosis is not',
'BP is best measured in the right arm (pre-ductal)',
'Normal weight loss of 5-7% in first 3-5 days; regain by 10-14 days'
]
},
'1-6mo': {
label: '1-6 Months',
hr: { awake: '100-150', sleeping: '85-135' },
rr: '30-53',
sbp: '70-90', dbp: '40-63',
temp: '36.5-37.5',
weight: '4-8 kg',
spo2: '>95%',
notes: [
'Expected weight gain: 20-30 g/day (150-200 g/week)',
'HR gradually decreases as vagal tone matures',
'RR >60 at rest may indicate lower respiratory tract disease',
'BP should be measured with appropriate cuff size (width 40% of arm circumference)'
]
},
'6-12mo': {
label: '6-12 Months',
hr: { awake: '80-140', sleeping: '75-130' },
rr: '25-40',
sbp: '72-95', dbp: '40-65',
temp: '36.0-37.5',
weight: '8-10 kg',
spo2: '>95%',
notes: [
'Expected weight: triple birth weight by 12 months (~10 kg average)',
'Weight gain slows to ~10-15 g/day',
'Sinus arrhythmia (HR varies with breathing) is normal',
'Febrile tachycardia: HR increases ~10 bpm per 1 degree C above 37'
]
},
'1-3yr': {
label: '1-3 Years',
hr: { awake: '80-130', sleeping: '70-120' },
rr: '20-30',
sbp: '80-105', dbp: '45-70',
temp: '36.0-37.5',
weight: '10-15 kg',
spo2: '>95%',
notes: [
'Expected weight gain: ~200-250 g/month (2-2.5 kg/year)',
'Tachycardia: HR >130 at rest warrants evaluation',
'Tachypnea: RR >30 at rest may indicate respiratory distress',
'BP screening begins at age 3 per AAP 2017 guidelines',
'Estimated weight: 2 x (age in years) + 8'
]
},
'4-5yr': {
label: '4-5 Years',
hr: { awake: '75-120', sleeping: '65-110' },
rr: '20-25',
sbp: '85-108', dbp: '48-70',
temp: '36.0-37.5',
weight: '15-20 kg',
spo2: '>95%',
notes: [
'Annual BP screening recommended from age 3',
'Normal BP <90th percentile for age, sex, and height',
'Elevated BP: 90th to <95th percentile (or 120/80 if lower)',
'Estimated weight: 2 x (age in years) + 8',
'ETT size (uncuffed): (age/4) + 4 = 5.0-5.25'
]
},
'6-9yr': {
label: '6-9 Years',
hr: { awake: '70-115', sleeping: '60-105' },
rr: '18-24',
sbp: '88-115', dbp: '50-75',
temp: '36.0-37.5',
weight: '20-30 kg',
spo2: '>95%',
notes: [
'Resting HR >115 or <60 warrants evaluation',
'BP should be measured at every clinical encounter',
'Stage 1 HTN: >=95th percentile on 3 separate occasions',
'Estimated weight: 3 x (age in years) + 7',
'ETT size (cuffed): (age/4) + 3.5 = 5.0-5.75'
]
},
'10-12yr': {
label: '10-12 Years',
hr: { awake: '65-110', sleeping: '58-100' },
rr: '16-22',
sbp: '95-120', dbp: '55-78',
temp: '36.0-37.5',
weight: '30-45 kg',
spo2: '>95%',
notes: [
'Pre-pubertal and early pubertal changes may affect vitals',
'Orthostatic hypotension may emerge during growth spurts',
'BP classification uses percentile tables for age <13',
'HR may decrease with athletic training',
'ETT size (cuffed): (age/4) + 3.5 = 6.0-6.5'
]
},
'13-15yr': {
label: '13-15 Years',
hr: { awake: '60-100', sleeping: '50-90' },
rr: '14-20',
sbp: '100-128', dbp: '58-80',
temp: '36.0-37.5',
weight: '45-65 kg',
spo2: '>95%',
notes: [
'From age 13: use adult BP thresholds (AAP 2017)',
'Normal: <120/<80 mmHg',
'Elevated: 120-129/<80 mmHg',
'Stage 1 HTN: 130-139/80-89 mmHg',
'Stage 2 HTN: >=140/>=90 mmHg',
'Athletic bradycardia (HR 45-60) may be normal in trained adolescents'
]
},
'16-18yr': {
label: '16-18 Years',
hr: { awake: '55-95', sleeping: '45-85' },
rr: '12-18',
sbp: '105-135', dbp: '60-85',
temp: '36.0-37.5',
weight: '55-80 kg',
spo2: '>95%',
notes: [
'Vital signs approach adult values',
'Adult BP thresholds apply (same as age 13+)',
'Orthostatic vitals: measure lying, sitting, standing if dizzy',
'Positive orthostatic test: SBP drop >20 or DBP drop >10 on standing',
'Consider screening for eating disorders if bradycardia + low BMI'
]
}
};
var vitalsSelect = document.getElementById('vitals-age-select');
if (vitalsSelect) {
vitalsSelect.addEventListener('change', function() {
var key = vitalsSelect.value;
var resultDiv = document.getElementById('vitals-result');
if (!key || !VITALS_DATA[key]) { resultDiv.classList.add('hidden'); return; }
var v = VITALS_DATA[key];
resultDiv.classList.remove('hidden');
resultDiv.innerHTML =
'<div class="calc-result-header" style="background:#eff6ff;border-color:#2563eb;">' +
'<div style="font-size:18px;font-weight:700;color:#1d4ed8;">' + v.label + '</div>' +
'</div>' +
'<div class="calc-result-grid" style="margin-top:12px;">' +
'<div class="calc-result-item"><div class="calc-result-label">Heart Rate (awake)</div><div class="calc-result-value" style="font-size:18px;color:#ef4444;">' + v.hr.awake + '</div><div class="calc-result-sub">bpm</div></div>' +
'<div class="calc-result-item"><div class="calc-result-label">Heart Rate (sleep)</div><div class="calc-result-value" style="font-size:18px;color:#8b5cf6;">' + v.hr.sleeping + '</div><div class="calc-result-sub">bpm</div></div>' +
'<div class="calc-result-item"><div class="calc-result-label">Respiratory Rate</div><div class="calc-result-value" style="font-size:18px;color:#0ea5e9;">' + v.rr + '</div><div class="calc-result-sub">breaths/min</div></div>' +
'<div class="calc-result-item"><div class="calc-result-label">Systolic BP</div><div class="calc-result-value" style="font-size:18px;color:#f97316;">' + v.sbp + '</div><div class="calc-result-sub">mmHg</div></div>' +
'<div class="calc-result-item"><div class="calc-result-label">Diastolic BP</div><div class="calc-result-value" style="font-size:18px;color:#f59e0b;">' + v.dbp + '</div><div class="calc-result-sub">mmHg</div></div>' +
'<div class="calc-result-item"><div class="calc-result-label">Temperature</div><div class="calc-result-value" style="font-size:18px;color:#10b981;">' + v.temp + '</div><div class="calc-result-sub">&deg;C</div></div>' +
'<div class="calc-result-item"><div class="calc-result-label">SpO2</div><div class="calc-result-value" style="font-size:18px;color:#06b6d4;">' + v.spo2 + '</div><div class="calc-result-sub"></div></div>' +
'<div class="calc-result-item"><div class="calc-result-label">Weight Range</div><div class="calc-result-value" style="font-size:18px;color:#6366f1;">' + v.weight + '</div><div class="calc-result-sub"></div></div>' +
'</div>' +
'<div style="margin-top:14px;padding:12px;background:var(--g50);border-radius:8px;">' +
'<div style="font-size:12px;font-weight:600;color:var(--g600);margin-bottom:6px;">Clinical Notes</div>' +
'<ul style="margin:0;padding-left:16px;font-size:12px;color:var(--g700);line-height:1.7;">' +
v.notes.map(function(n) { return '<li>' + n + '</li>'; }).join('') +
'</ul>' +
'</div>';
});
}
}
})();