feat(pe-guide): real audio, innocent-murmur panel, APTM image, all-ages resp+CV

Four changes rolled together:

1. REAL AUDIO from Wikimedia Commons (CC BY-SA 3.0, attribution to follow
   in privacy policy per Daniel). Embedded in /public/audio/ — synthesis
   stays as fallback for sounds not available from Wikimedia.
   respiratorySounds.js now tries the real OGG first; falls back to Web
   Audio synthesis if file missing.

2. REAL APTM IMAGE from Daniel's Nextcloud share, placed at
   /public/images/pe-guide/aptm.png (134 KB PNG). Replaces the inline SVG.
   Kept the side legend with A/P/E/T/M colour-coded points.

3. INNOCENT MURMUR REFERENCE PANEL below the APTM diagram with the 5
   classic innocent murmurs (Still's, pulmonary flow, venous hum, carotid
   bruit, PPS) — age, location, character, confirming maneuver — plus
   the 7 "S" criteria summary.

4. ALL-AGE RESP + CV DATA. Before: only adolescent. Now every age group
   has age-appropriate resp + cv content (newborn through adolescent).
   Newborn: Silverman, pre/postductal sats, duct-dependent lesion screen.
   Infant: bronchiolitis, CHF diaphoresis, VSD, early CHD.
   Toddler: croup/FB/epiglottitis, innocent murmur peak age.
   Preschool + school-age: adult-pattern transition, sports screening.
This commit is contained in:
Daniel 2026-04-22 21:00:26 +02:00
parent 32d6dae7a5
commit a3be6bad29
10 changed files with 331 additions and 7 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

View file

@ -204,12 +204,46 @@
var APTM_LEGEND = [
{ letter: 'A', color: '#dc2626', title: 'Aortic area', location: '2nd ICS, right sternal border', listen: 'S2 (aortic component), aortic stenosis, aortic regurgitation' },
{ letter: 'P', color: '#2563eb', title: 'Pulmonic area', location: '2nd ICS, left sternal border', listen: 'S2 (pulmonic component), pulmonic stenosis, PDA, physiologic split of S2' },
{ letter: 'E', color: '#059669', title: 'Erb\'s point', location: '3rd ICS, left sternal border', listen: 'Aortic regurgitation (best here), innocent flow murmurs' },
{ letter: 'T', color: '#d97706', title: 'Tricuspid area', location: '4th5th ICS, lower left sternal border', listen: 'Tricuspid regurgitation, VSD, S3/S4, holosystolic murmurs' },
{ letter: 'P', color: '#2563eb', title: 'Pulmonic area', location: '2nd ICS, left sternal border', listen: 'S2 (pulmonic component), pulmonic stenosis, PDA, physiologic split of S2',
innocent: 'Pulmonary flow murmur (children, adolescents) — upper left sternal border' },
{ letter: 'E', color: '#059669', title: 'Erb\'s point', location: '3rd ICS, left sternal border', listen: 'Aortic regurgitation (best here), transitional zone murmurs',
innocent: 'Still\'s murmur classically radiates to Erb\'s / LLSB' },
{ letter: 'T', color: '#d97706', title: 'Tricuspid area', location: '4th5th ICS, lower left sternal border', listen: 'Tricuspid regurgitation, VSD, S3/S4, holosystolic murmurs',
innocent: 'Still\'s murmur — vibratory, musical, age 37 y (loudest between LLSB and apex)' },
{ letter: 'M', color: '#7c3aed', title: 'Mitral area (apex)', location: '5th ICS, mid-clavicular line', listen: 'S1, mitral regurgitation, mitral stenosis (with bell, left-lateral decubitus)' }
];
// ────────────────────────────────────────────────────────────
// INNOCENT MURMURS — the classic benign murmurs of childhood
// ────────────────────────────────────────────────────────────
var INNOCENT_MURMURS = [
{ name: 'Still\'s (vibratory) murmur',
age: '37 y (most common in children)',
location: 'LLSB, radiating to apex',
character: 'Low-frequency vibratory / musical systolic, grade 23/6, mid-systolic, "twanging-string" quality',
confirm: 'Louder supine, softer or disappears on standing or Valsalva. No radiation to neck/back. Normal S2.' },
{ name: 'Pulmonary flow murmur',
age: 'School-age and adolescents, thin chest',
location: 'Upper left sternal border (2nd3rd ICS)',
character: 'Soft blowing early systolic ejection, grade 12/6, higher-pitched',
confirm: 'No ejection click. Physiologic split of S2. Louder supine, softer on standing. No radiation.' },
{ name: 'Venous hum',
age: 'Ages 38, disappears by adolescence',
location: 'Supraclavicular or infraclavicular area, usually right',
character: 'Soft continuous hum, louder in diastole. Only innocent continuous murmur.',
confirm: 'Disappears when supine OR when jugular vein is gently compressed (key maneuver). Turning head to opposite side also alters it.' },
{ name: 'Carotid bruit / supraclavicular bruit',
age: 'Children and adolescents',
location: 'Supraclavicular fossa, right > left; may radiate to carotid',
character: 'Brief early systolic, grade 23/6, higher-pitched than Still\'s',
confirm: 'Softer or disappears with hyperextension of the shoulders. Normal cardiac exam otherwise. No radiation below the clavicles.' },
{ name: 'Peripheral pulmonary stenosis (PPS, neonatal)',
age: 'Newborns and infants < 612 months',
location: 'Upper LSB, radiates to BOTH axillae and the back',
character: 'Soft systolic ejection murmur, grade 12/6',
confirm: 'Typical age + radiation to back/axillae. Resolves by age 1 as branch pulmonary arteries grow. Persistence or louder grade warrants echo.' }
];
// ────────────────────────────────────────────────────────────
// RESPIRATORY SOUNDS LIBRARY
// ────────────────────────────────────────────────────────────
@ -345,6 +379,58 @@
{ label: 'Symmetry check', method: 'Repeat opposite foot', normal: 'Symmetric response' }
], abnormalHints: ['Asymmetric response is always abnormal'] }
]
},
resp: {
overview: 'Newborn respiratory transition — RDS, TTN, pneumonia, meconium aspiration dominate the differential. Normal RR ≤ 60. Grunting is an alarm sign.',
components: [
{ name: 'Inspection',
significance: 'Detects distress and localises cause. Silverman score quantifies retraction severity.',
pearl: 'Grunting is physiologic PEEP against a partially closed glottis — always a sign of significant lung pathology in a newborn. Never dismiss it as fussy breathing.',
steps: [
{ label: 'Respiratory rate', method: 'Count over full 60 s, quiet and undisturbed.', normal: '4060 /min; tachypnea > 60' },
{ label: 'Work of breathing (Silverman)', method: 'Inspect for upper-chest retraction, lower-chest retraction, xiphoid retraction, nasal flaring, grunting. Score 02 for each.', normal: 'Total Silverman 0 — no distress' },
{ label: 'Audible sounds', method: 'Listen without stethoscope — stridor? grunting? wheeze across the room?', normal: 'Quiet respirations' },
{ label: 'Colour', method: 'Inspect trunk and mucous membranes for central cyanosis; acrocyanosis (blue hands/feet) is normal in the first days.', normal: 'Pink trunk and mucous membranes' },
{ label: 'Chest shape', method: 'Inspect AP:transverse diameter and symmetry.', normal: 'Slightly barrel-shaped is normal; symmetric' }
],
abnormalHints: ['Grunting — RDS, pneumonia, sepsis, CHD', 'Retractions + tachypnea — RDS, TTN, pneumothorax', 'Central cyanosis — cyanotic CHD, severe lung disease, persistent pulmonary HTN', 'Asymmetric chest movement — pneumothorax, diaphragmatic hernia'] },
{ name: 'Auscultation',
significance: 'Short stethoscope time in neonates because they fuss easily — get the most important zones first.',
pearl: 'Listen at the axilla, not just the anterior chest — pneumothorax can sound normal anteriorly. Auscultate both axillae systematically.',
steps: [
{ label: 'Air entry — anterior', method: 'Listen bilaterally at the upper and lower anterior chest.', normal: 'Symmetric bilateral air entry' },
{ label: 'Air entry — axillary', method: 'Listen bilaterally at each axilla — this is the most sensitive area for detecting a small pneumothorax.', normal: 'Clear and symmetric' },
{ label: 'Adventitious sounds', method: 'Listen for transmitted upper-airway sounds, crackles (RDS, pneumonia), grunting sounds.', normal: 'No crackles, no wheeze, clear sounds' },
{ label: 'Inspiration:expiration ratio', method: 'Observe breath-sound timing.', normal: 'Inspiration > expiration in length' }
],
abnormalHints: ['Asymmetric air entry — pneumothorax, diaphragmatic hernia, endobronchial intubation', 'Fine crackles — RDS, TTN, pneumonia', 'Absent breath sounds unilaterally — pneumothorax or selective intubation'] }
]
},
cv: {
overview: 'Neonatal CV exam screens for CHD — the window of presentation is short and some lesions (duct-dependent) decompensate within hours of birth. Pre/postductal saturations + femoral pulses are the two fastest screens.',
components: [
{ name: 'Inspection and pre/postductal saturations',
significance: 'Pre/postductal SpO₂ differential > 3% suggests a duct-dependent lesion or persistent pulmonary HTN. Universal CCHD screening uses this.',
pearl: 'Pulse ox on the right hand = preductal (proximal to PDA insertion). Foot = postductal. Both arms and both legs should match; a differential is a red flag for critical CHD.',
steps: [
{ label: 'Central cyanosis', method: 'Inspect tongue, lips, oral mucosa.', normal: 'Pink mucous membranes' },
{ label: 'Pre/postductal SpO₂', method: 'Measure SpO₂ in right hand (preductal) AND either foot (postductal). Baby must be ≥24 hr old for CCHD screening.', normal: 'Both ≥ 95% AND difference < 3%' },
{ label: 'Peripheral perfusion', method: 'Capillary refill on sternum; note mottling or distal cyanosis.', normal: 'Capillary refill < 2 s, warm pink extremities' },
{ label: 'Precordial activity', method: 'Inspect anterior chest for hyperactive precordium.', normal: 'Not visible or minimally visible' }
],
abnormalHints: ['Central cyanosis with SpO₂ < 95% → cyanotic CHD workup (4-extremity BP, ECG, hyperoxia test, echo)', 'Differential > 3% (pre > post) → duct-dependent systemic flow (HLHS, coarctation, interrupted arch)', 'Preductal < postductal — persistent pulmonary HTN with reversed shunt'] },
{ name: 'Palpation and auscultation',
significance: 'Absent femoral pulses + arm-leg BP gradient = coarctation. Many CHD lesions manifest murmurs only after ductus closes (4872 h).',
pearl: 'Always palpate femoral pulses before discharging any newborn. Absent femorals in a well-appearing baby can be the only finding in a ductal-dependent coarctation — catastrophic if missed.',
steps: [
{ label: 'Apex beat', method: 'Palpate at the 4th ICS left of sternum (apex is higher in newborns).', normal: 'Palpable at 4th ICS, mid-clavicular or just lateral' },
{ label: 'Femoral pulses', method: 'Palpate both femoral pulses at the mid-inguinal point while simultaneously feeling the right brachial pulse — detects delay.', normal: 'Present, symmetric, equal timing with brachial' },
{ label: 'Auscultate each cardiac area', method: 'Use pediatric diaphragm at each classic point; baby quiet if possible.', normal: 'S1 S2 crisp; physiologic flow murmur sometimes present in the first 2448 h' },
{ label: 'Continuous murmur', method: 'Listen below the left clavicle for a continuous ("machinery") murmur of PDA.', normal: 'No continuous murmur after the first day of life in a term baby' },
{ label: 'Four-limb BP (if any concern)', method: 'Right arm, left arm, both legs.', normal: 'Within 10 mmHg across limbs' }
],
abnormalHints: ['Absent femoral pulses — coarctation of the aorta (surgical emergency if duct-dependent)', 'Harsh holosystolic at LLSB — VSD', 'Continuous machinery murmur — PDA (expected in preterm; in term > 48 h is abnormal)', 'Gallop S3/S4 — heart failure', 'Single S2 — transposition, truncus, severe AS/PS'] }
]
}
},
@ -414,6 +500,58 @@
{ label: 'Landau', method: 'Suspend prone', normal: 'Extends head, spine, legs by 6mo' }
], abnormalHints: ['Absent parachute after 12mo (concerning)', 'Asymmetric lateral propping', 'Absent Landau'] }
]
},
resp: {
overview: 'Infant respiratory disease centers on bronchiolitis, reactive airways, and pneumonia. Normal RR ≤ 50 (< 2 mo: ≤ 60). Infants are obligate nose-breathers — nasal congestion alone can cause significant WOB.',
components: [
{ name: 'Inspection',
significance: 'Infant distress signs escalate fast. Nasal flaring, tracheal tug, head bobbing = significant WOB. Apnea in an infant < 2 mo is an emergency.',
pearl: 'A quiet infant with retractions is more worrying than a crying one — exhausted infants stop crying and become hypoxic silently.',
steps: [
{ label: 'Respiratory rate', method: 'Count over full 60 s while quiet.', normal: '< 2 mo: ≤ 60; 212 mo: ≤ 50' },
{ label: 'Work of breathing', method: 'Inspect nasal flaring, subcostal/intercostal/suprasternal retractions, tracheal tug, head-bobbing, accessory muscle use.', normal: 'No retractions, effortless breathing' },
{ label: 'Audible sounds', method: 'Stridor? Wheeze across the room? Grunting? Prolonged expiration?', normal: 'Quiet respirations' },
{ label: 'Colour and feeding history', method: 'Central cyanosis? Poor feeding (feeding is an effort marker in infants)?', normal: 'Pink, feeds well' },
{ label: 'Apnea observation', method: 'Watch for ≥ 20-s pauses or pauses < 20 s with bradycardia/cyanosis.', normal: 'No apneas' }
],
abnormalHints: ['Grunting / persistent retractions — pneumonia, bronchiolitis, CHF', 'Wheeze — bronchiolitis (RSV), asthma, foreign body', 'Stridor — croup (6 mo6 y), laryngomalacia (infant), foreign body', 'Apnea — bronchiolitis, sepsis, pertussis, seizure'] },
{ name: 'Auscultation',
significance: 'Infants have a thin chest wall — sounds transmit widely. Symmetry, wheeze, and crackles are the main findings.',
pearl: 'In bronchiolitis, the classical finding is widespread end-inspiratory fine crackles PLUS expiratory wheeze. Tachypnea + retractions in an RSV-season infant confirms.',
steps: [
{ label: 'Air entry — bilateral', method: 'Warm stethoscope; listen at anterior chest and both axillae, both sides.', normal: 'Symmetric air entry' },
{ label: 'Wheeze', method: 'Listen in expiration. Diffuse wheeze = lower airway; focal wheeze = foreign body or local obstruction.', normal: 'No wheeze' },
{ label: 'Crackles', method: 'Listen in late inspiration. Focal = pneumonia; diffuse fine = bronchiolitis.', normal: 'No crackles' },
{ label: 'Prolonged expiration', method: 'Note expiration:inspiration length ratio.', normal: 'Inspiration ≥ expiration' }
],
abnormalHints: ['Focal crackles + fever — pneumonia', 'Diffuse wheeze + fine crackles in an RSV-season infant — bronchiolitis', 'Silent chest with extreme WOB — impending respiratory failure'] }
]
},
cv: {
overview: 'Most CHD manifests in the first year as pulmonary blood-flow changes and the ductus closes. Infant CV exam = growth review + inspection + femoral pulses + auscultation. A harsh pan-systolic LLSB murmur in a 6-week-old = VSD until proven otherwise.',
components: [
{ name: 'Inspection and functional assessment',
significance: 'Heart failure in infants presents as poor feeding, sweating during feeds (diaphoresis), tachypnea, and poor weight gain. These historical features predict bad exam findings.',
pearl: 'Ask "Does the baby sweat while feeding?" — infant CHF presents with diaphoresis on the forehead during feeds, well before peripheral edema appears.',
steps: [
{ label: 'Growth trajectory', method: 'Plot weight-for-age on WHO chart. Failure to thrive raises CHD concern.', normal: 'Tracking ≥ 10th percentile or stable on personal curve' },
{ label: 'Feeding history', method: 'Ask about feed duration, sweating with feeds, tachypnea with feeds, tiring easily.', normal: 'Feeds < 20 min, no diaphoresis, no tachypnea' },
{ label: 'Central cyanosis', method: 'Inspect tongue and oral mucosa.', normal: 'Pink' },
{ label: 'Clubbing', method: 'Inspect finger nail beds (subtle in infants).', normal: 'No clubbing' },
{ label: 'Peripheral perfusion', method: 'Cap refill, warmth of extremities.', normal: 'Cap refill < 2 s, warm extremities' }
],
abnormalHints: ['Poor weight gain — consider CHF from L-to-R shunt (VSD, PDA, AVSD)', 'Diaphoresis with feeds — infant CHF', 'Tiring with feeds — significant CHD', 'Central cyanosis — cyanotic CHD (ToF, TGA, TA, etc.)'] },
{ name: 'Palpation and auscultation',
significance: 'Femoral pulses + 4-limb BP screen coarctation. A harsh holosystolic murmur at LLSB is almost always a VSD in this age.',
pearl: 'Listen over each of the 5 classic points as in the adult exam — the locations shift slightly with infant chest size but relative positions are the same. Also listen at the back: coarctation murmurs radiate there.',
steps: [
{ label: 'Apex beat', method: 'Palpate at 4th ICS mid-clavicular line.', normal: 'Palpable at 4th ICS in infants' },
{ label: 'Femoral pulses', method: 'Palpate bilaterally, simultaneously with right brachial.', normal: 'Present, equal, no delay vs brachial' },
{ label: 'Listen at each classic area (APTM)', method: 'See APTM diagram. Use pediatric stethoscope with both diaphragm and bell.', normal: 'S1 and S2 crisp, no murmur or physiologic only' },
{ label: 'Listen over the back (interscapular)', method: 'Check for radiation of coarctation murmurs.', normal: 'No radiating murmur' }
],
abnormalHints: ['Harsh holosystolic LLSB murmur — VSD', 'Continuous "machinery" murmur below left clavicle — PDA', 'Systolic ejection at ULSB + fixed split S2 — ASD', 'Ejection murmur at ULSB + cyanosis — tetralogy of Fallot', 'Absent femorals + radio-femoral delay — coarctation', 'Gallop + tachycardia — heart failure'] }
]
}
},
@ -501,6 +639,48 @@
{ label: 'Stroke lateral sole', method: 'Firm stroke from heel to toes', normal: 'Down-going great toe (plantar flexion) by age 2' }
], abnormalHints: ['Up-going toe after age 2 = UMN sign (Babinski positive)'] }
]
},
resp: {
overview: 'Toddler respiratory disease: viral URIs, reactive airways, croup (6 mo6 y classical age), foreign-body aspiration (age 13 is peak). Normal RR ≤ 40.',
components: [
{ name: 'Inspection',
pearl: 'Sudden onset of unilateral wheeze + choking history in a toddler = foreign body until proven otherwise. CXR in expiration (or decubitus) helps show the trapped air.',
steps: [
{ label: 'Respiratory rate', method: 'Count over full 60 s if possible.', normal: '≤ 40 /min' },
{ label: 'Work of breathing', method: 'Retractions, nasal flaring, tracheal tug.', normal: 'No retractions' },
{ label: 'Audible sounds', method: 'Stridor (croup), wheeze, barking cough.', normal: 'Quiet respirations' },
{ label: 'Drooling / posture', method: 'Tripod positioning, drooling (epiglottitis in unvaccinated child).', normal: 'No drooling, normal posture' }
],
abnormalHints: ['Barking cough + stridor — croup', 'Drooling + tripod + toxic — epiglottitis (emergency)', 'Sudden unilateral wheeze — foreign body aspiration'] },
{ name: 'Auscultation',
steps: [
{ label: 'Air entry', method: 'Cooperation variable — listen quickly and systematically.', normal: 'Symmetric' },
{ label: 'Adventitious sounds', method: 'Wheeze, crackles, stridor at the neck.', normal: 'Clear lung fields' },
{ label: 'Unilateral findings', method: 'Focal wheeze, decreased air entry, or asymmetry — think foreign body or pneumonia.', normal: 'Symmetric bilateral' }
],
abnormalHints: ['Unilateral decreased breath sounds + wheeze — foreign body', 'Focal crackles — pneumonia', 'Diffuse wheeze — asthma/RAD'] }
]
},
cv: {
overview: 'Most hemodynamically significant CHD has been detected by this age. Innocent murmurs peak here (Still\'s murmur, venous hum). The exam is adult-pattern but with smaller chest and less cooperation.',
components: [
{ name: 'Inspection and palpation',
pearl: 'Innocent murmurs are a normal finding in well toddlers — soft, systolic, at the LLSB, musical, and they change with position. Anything that doesn\'t fit that pattern deserves referral.',
steps: [
{ label: 'General appearance + growth', method: 'Happy, active, tracking growth.', normal: 'Normal growth and activity' },
{ label: 'Colour and clubbing', method: 'Inspect tongue, nail beds.', normal: 'Pink, no clubbing' },
{ label: 'Apex beat', method: 'Palpate at 5th ICS mid-clavicular line.', normal: 'Located at 5th ICS MCL, tapping quality' },
{ label: 'Peripheral pulses', method: 'Brachial + femoral, symmetric and simultaneous.', normal: 'Symmetric, no delay' }
],
abnormalHints: ['Tiring with play, poor growth — missed CHD', 'Cyanosis + clubbing — cyanotic CHD', 'Absent femorals — coarctation'] },
{ name: 'Auscultation',
steps: [
{ label: 'All 5 classic points', method: 'See APTM diagram above — Aortic, Pulmonic, Erb\'s, Tricuspid, Mitral.', normal: 'Crisp S1, S2 with physiologic split at pulmonic area' },
{ label: 'Evaluate any murmur', method: 'Timing, location, radiation, grade. Apply the "7 S" innocent-murmur criteria.', normal: 'No murmur, or soft (≤ grade 2) innocent murmur' },
{ label: 'Change with position', method: 'Have toddler sit, stand, lie down — does the murmur change? Innocent murmurs typically disappear or soften with standing.', normal: 'Murmur (if any) changes with position' }
],
abnormalHints: ['Harsh, loud (≥3/6), radiating, or diastolic murmur — not innocent, refer', 'Cyanosis + murmur — CHD workup', 'Fixed split S2 — ASD'] }
]
}
},
@ -603,6 +783,47 @@
{ label: 'Romberg (5y+)', method: 'Feet together, eyes closed, stand 10s', normal: 'Stable without sway' }
], abnormalHints: ['Ataxic gait (cerebellar)', 'Romberg positive (dorsal column)', 'Circumduction (UMN)'] }
]
},
resp: {
overview: 'Adult-pattern but shorter. Cooperation better than toddler. RR ≤ 30. Common: asthma/RAD, pneumonia, URIs.',
components: [
{ name: 'Inspection',
steps: [
{ label: 'Respiratory rate', method: 'Count over full 60 s quietly.', normal: '≤ 30 /min' },
{ label: 'Work of breathing', method: 'Retractions, nasal flaring, accessory muscle use.', normal: 'Effortless breathing' },
{ label: 'Audible sounds', method: 'Wheeze, stridor, cough quality (barking = croup).', normal: 'Quiet' },
{ label: 'Chest shape', method: 'AP:transverse, hyperinflation signs.', normal: 'Not barrel-chested' }
],
abnormalHints: ['Barrel chest — chronic asthma, cystic fibrosis', 'Retractions + wheeze — asthma exacerbation'] },
{ name: 'Auscultation',
steps: [
{ label: 'Systematic zones', method: 'Upper, mid, lower fields anteriorly and posteriorly; axillae bilaterally. Cooperative deep breaths through mouth.', normal: 'Symmetric vesicular sounds' },
{ label: 'Wheeze', method: 'Expiratory, diffuse (asthma) or focal (foreign body, rare at this age).', normal: 'No wheeze' },
{ label: 'Crackles', method: 'Focal = pneumonia; diffuse fine = interstitial disease (rare in kids).', normal: 'No crackles' }
],
abnormalHints: ['Focal crackles + fever — pneumonia', 'Diffuse wheeze — asthma', 'Prolonged expiration with wheeze — lower airway obstruction'] }
]
},
cv: {
overview: 'Most CHD is detected by this age. Innocent murmurs peak in this range. Sports participation exams require thorough CV screening.',
components: [
{ name: 'Inspection and palpation',
steps: [
{ label: 'General and growth', method: 'Track on growth curve; activity tolerance.', normal: 'Normal growth, active' },
{ label: 'Apex beat', method: '5th ICS mid-clavicular line.', normal: 'Normal position and character' },
{ label: 'Peripheral pulses', method: 'Brachial + femoral simultaneously. BP in arm and leg if HTN.', normal: 'Symmetric, no delay' }
],
abnormalHints: ['Absent femorals or arm-leg BP gradient — coarctation (always check in HTN screening)', 'Displaced apex — cardiomegaly'] },
{ name: 'Auscultation',
pearl: 'The 7 "S" criteria and the 5 classic innocent murmurs (see panel above) handle most murmurs you\'ll find in this age group. Still\'s murmur is the single most common.',
steps: [
{ label: 'All 5 classic points', method: 'Walk through A → P → E → T → M with diaphragm then bell.', normal: 'S1 S2 clear, physiologic S2 split at pulmonic, no added sounds' },
{ label: 'Any murmur', method: 'Characterise: timing, location, radiation, grade, character. Apply 7 S criteria + compare to innocent-murmur panel.', normal: 'No murmur, or innocent flow murmur meeting all 7 S criteria' },
{ label: 'Position change', method: 'Standing vs supine. Innocent murmurs typically soften or disappear on standing.', normal: 'Murmur (if any) changes with position' },
{ label: 'Sports screening extras (if applicable)', method: 'Screen for HOCM — murmur intensifies with Valsalva and standing (opposite of most).', normal: 'No murmur worsening on Valsalva' }
],
abnormalHints: ['Murmur breaking any of the 7 S criteria — refer', 'Harsh systolic at LUSB + fixed split S2 — ASD', 'Murmur louder with Valsalva — HOCM (sports participation risk)', 'Diastolic murmur — always pathologic'] }
]
}
},
@ -720,6 +941,58 @@
{ label: 'Romberg', method: 'Feet together, eyes closed, 30s', normal: 'Stable without fall or significant sway' }
], abnormalHints: ['Wide-based (cerebellar)', 'Steppage (peripheral neuropathy)', 'Scissoring (UMN)', 'Romberg positive (dorsal column)', 'Circumduction'] }
]
},
resp: {
overview: 'Nearly adult-pattern. Exam the same as adolescent with slightly more flexibility in cooperation. RR ≤ 30 in younger school-age, ≤ 20 in older. Sports history relevant (exercise-induced asthma).',
components: [
{ name: 'Inspection',
steps: [
{ label: 'Respiratory rate', method: 'Count over 60 s.', normal: '≤ 30 (611 y)' },
{ label: 'Work of breathing', method: 'Retractions, accessory muscles.', normal: 'Effortless' },
{ label: 'Audible sounds', method: 'Listen for wheeze, stridor.', normal: 'Quiet' },
{ label: 'Chest shape', method: 'Barrel chest, pectus deformities.', normal: 'Normal shape' },
{ label: 'Clubbing', method: 'Schamroth window test.', normal: 'No clubbing' }
],
abnormalHints: ['Clubbing — CF, chronic hypoxemia, bronchiectasis', 'Barrel chest — chronic asthma, CF'] },
{ name: 'Palpation and percussion',
steps: [
{ label: 'Tracheal position', method: 'Middle finger in suprasternal notch.', normal: 'Midline' },
{ label: 'Chest expansion', method: 'Hands laterally, thumbs meeting at spine. Deep breath.', normal: 'Symmetric 35 cm' },
{ label: 'Tactile fremitus', method: 'Ulnar side of hand; "ninety-nine". Compare sides.', normal: 'Symmetric' },
{ label: 'Percussion', method: 'Pleximeter + plexor technique. Compare sides.', normal: 'Resonant throughout' }
],
abnormalHints: ['Deviated trachea — pneumothorax, effusion, collapse', 'Dull percussion — consolidation, effusion', 'Hyper-resonant — pneumothorax, hyperinflation'] },
{ name: 'Auscultation',
steps: [
{ label: 'Systematic zones', method: 'Six anterior + four lateral + six posterior zones, compare side-to-side.', normal: 'Symmetric vesicular sounds' },
{ label: 'Adventitious sounds', method: 'Wheeze, crackles, rhonchi, rub, stridor at neck. Use sounds library for reference.', normal: 'No added sounds' },
{ label: 'Cough re-listen', method: 'Secretions (rhonchi, coarse crackles) should clear; fibrosis crackles do not.', normal: 'Secretion-based sounds clear with cough' }
],
abnormalHints: ['Focal crackles + fever — pneumonia', 'Diffuse fine crackles — early interstitial disease', 'Expiratory wheeze — asthma / RAD'] }
]
},
cv: {
overview: 'Nearly adult-pattern. Sports participation screening is a key indication in this age. HOCM screening (family history of sudden cardiac death, exertional syncope, murmur louder with Valsalva) is specifically relevant.',
components: [
{ name: 'Inspection and palpation',
pearl: 'For sports participation exams, always ask about exertional symptoms (syncope, chest pain, unexpected fatigue) AND family history of sudden cardiac death before age 50. Screening exam alone catches only ~3% of HOCM.',
steps: [
{ label: 'General and growth', method: 'Track on growth curve; review activity tolerance.', normal: 'Normal growth, age-appropriate activity' },
{ label: 'Colour and clubbing', method: 'Inspect mucous membranes and nail beds.', normal: 'Pink, no clubbing' },
{ label: 'Apex beat', method: 'Palpate at 5th ICS mid-clavicular line.', normal: 'Normal position, tapping character' },
{ label: 'Peripheral pulses', method: 'Simultaneous brachial + femoral.', normal: 'Symmetric, no delay' },
{ label: 'Blood pressure', method: 'Measure BP with appropriately sized cuff. If elevated, check both arms and one leg.', normal: 'Age-appropriate (< 120/80 roughly by 10+ years)' }
],
abnormalHints: ['Exertional syncope — HOCM, arrhythmia, LQTS', 'BP differential — coarctation', 'Displaced apex — cardiomegaly'] },
{ name: 'Auscultation',
steps: [
{ label: 'All 5 classic points', method: 'See APTM diagram. A → P → E → T → M with diaphragm and bell.', normal: 'S1, S2 clear with physiologic split at P, no added sounds' },
{ label: 'Grade any murmur', method: 'Levine 16 (see scales above); characterise timing, location, radiation.', normal: 'No murmur, or innocent flow murmur meeting all 7 S criteria' },
{ label: 'Innocent vs pathologic', method: 'Apply 7 S criteria; compare to innocent-murmur panel.', normal: 'Innocent murmur (if present) clearly fits all 7 S features' },
{ label: 'Dynamic maneuvers', method: 'Standing: HOCM louder; most others soften. Valsalva: HOCM louder.', normal: 'Murmur (if any) softens on standing and Valsalva' }
],
abnormalHints: ['Murmur louder with Valsalva / standing — HOCM (sports disqualification considerations)', 'Any diastolic murmur', 'Murmur ≥ grade 3, radiating, or with thrill'] }
]
}
},
@ -1107,12 +1380,12 @@
html += ' <div style="padding:0 16px 14px;font-size:13px;line-height:1.65;color:var(--g700);">' + esc(section.overview) + '</div>';
html += '</div>';
// ─ APTM cardiac auscultation diagram (only for cv system) ─
// ─ APTM cardiac auscultation diagram + innocent-murmur map (cv only) ─
if (currentSystem === 'cv') {
html += '<div class="card" style="margin-bottom:14px;border:1px solid ' + accent + '33;">';
html += ' <div class="card-header" style="background:' + accentTint + ';"><h3 style="margin:0;font-size:14px;color:' + accent + ';"><i class="fas fa-stethoscope"></i> Auscultation landmarks — APTM + Erb\'s</h3></div>';
html += ' <div style="padding:14px;display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start;">';
html += ' <div>' + APTM_SVG + '</div>';
html += ' <div style="padding:14px;display:grid;grid-template-columns:minmax(280px,1fr) 1fr;gap:16px;align-items:start;">';
html += ' <div><img src="/images/pe-guide/aptm.png" alt="APTM cardiac auscultation points diagram" style="max-width:100%;height:auto;display:block;margin:0 auto;border-radius:8px;"/></div>';
html += ' <div style="font-size:12px;line-height:1.55;">';
APTM_LEGEND.forEach(function (p) {
html += '<div style="display:flex;gap:10px;margin-bottom:10px;align-items:flex-start;">';
@ -1121,11 +1394,30 @@
html += ' <div style="font-weight:600;color:var(--g800);font-size:13px;">' + esc(p.title) + '</div>';
html += ' <div style="color:var(--g600);font-size:11px;margin-top:1px;">' + esc(p.location) + '</div>';
html += ' <div style="color:var(--g700);margin-top:3px;font-size:12px;"><strong>Listen for:</strong> ' + esc(p.listen) + '</div>';
if (p.innocent) {
html += ' <div style="color:#047857;margin-top:2px;font-size:11px;"><i class="fas fa-leaf" style="margin-right:3px;"></i><em>Innocent murmur(s):</em> ' + esc(p.innocent) + '</div>';
}
html += ' </div>';
html += '</div>';
});
html += ' </div>';
html += ' </div>';
// ─ Innocent murmur reference panel ─
html += ' <div style="border-top:1px solid var(--g200);padding:14px;background:#f0fdf4;">';
html += ' <div style="font-weight:600;font-size:13px;color:#047857;margin-bottom:8px;"><i class="fas fa-leaf"></i> Classic innocent murmurs (benign, no workup needed)</div>';
html += ' <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px;">';
INNOCENT_MURMURS.forEach(function (m) {
html += '<div style="background:#fff;border:1px solid var(--g200);border-radius:8px;padding:10px 12px;">';
html += ' <div style="font-weight:600;color:var(--g800);font-size:13px;margin-bottom:3px;">' + esc(m.name) + '</div>';
html += ' <div style="font-size:11px;color:var(--g500);margin-bottom:4px;">Age: ' + esc(m.age) + ' · Location: ' + esc(m.location) + '</div>';
html += ' <div style="font-size:12px;color:var(--g700);line-height:1.55;"><strong>Sound:</strong> ' + esc(m.character) + '</div>';
html += ' <div style="font-size:12px;color:var(--g700);line-height:1.55;margin-top:3px;"><strong>Confirm innocent:</strong> ' + esc(m.confirm) + '</div>';
html += '</div>';
});
html += ' </div>';
html += ' <div style="margin-top:10px;font-size:11px;color:var(--g600);line-height:1.55;"><strong>The 7 "S" innocent-murmur criteria:</strong> Soft (≤ 2/6) · Systolic · Short · Single (no S3/S4) · Small (non-radiating) · Sweet (musical) · Sensitive to position/respiration. Any murmur breaking this pattern — diastolic, ≥ grade 3, radiating, continuous, accompanied by symptoms — deserves pediatric cardiology referral.</div>';
html += ' </div>';
html += '</div>';
}

View file

@ -284,9 +284,40 @@
'grunting': playGrunting
};
// Real audio files served from /public/audio/respiratory/. Where a real
// recording is available, it plays instead of the synthesizer. Source:
// Wikimedia Commons (J. Heilman MD, CC BY-SA 3.0). Missing entries fall
// back to synthesis.
var REAL_AUDIO = {
'wheeze': '/audio/respiratory/wheeze.ogg',
'stridor': '/audio/respiratory/stridor.ogg',
'finecrackles': '/audio/respiratory/crackles-fine.ogg',
'coarsecrackles': '/audio/respiratory/crackles-coarse.ogg'
// normal, rhonchi, pleuralrub, grunting → synthesis only
};
var _audioEl = null;
function playReal(url) {
try {
stopCurrent();
if (!_audioEl) _audioEl = new Audio();
_audioEl.src = url;
_audioEl.play().catch(function () { /* ignore autoplay errors */ });
_currentStop = function () { try { _audioEl.pause(); _audioEl.currentTime = 0; } catch (e) {} };
return true;
} catch (e) {
return false;
}
}
window.RespSounds = {
play: function (name) {
var fn = PLAYERS[(name || '').toLowerCase()];
var key = (name || '').toLowerCase();
// Prefer real recording if available
if (REAL_AUDIO[key]) {
if (playReal(REAL_AUDIO[key])) return true;
}
var fn = PLAYERS[key];
if (!fn) return false;
// Ensure audio context is running (browsers suspend until a user gesture)
var ac = ctx(); if (!ac) { showToast && showToast('Audio not supported', 'error'); return false; }
@ -294,6 +325,7 @@
fn();
return true;
},
isReal: function (name) { return !!REAL_AUDIO[(name || '').toLowerCase()]; },
stop: stopCurrent,
list: Object.keys(PLAYERS)
};