diff --git a/public/audio/cardiac/mitral-prolapse.wav b/public/audio/cardiac/mitral-prolapse.wav new file mode 100644 index 0000000..2227290 Binary files /dev/null and b/public/audio/cardiac/mitral-prolapse.wav differ diff --git a/public/audio/cardiac/normal.ogg b/public/audio/cardiac/normal.ogg new file mode 100644 index 0000000..b46451d Binary files /dev/null and b/public/audio/cardiac/normal.ogg differ diff --git a/public/audio/cardiac/vsd.wav b/public/audio/cardiac/vsd.wav new file mode 100644 index 0000000..97265e4 Binary files /dev/null and b/public/audio/cardiac/vsd.wav differ diff --git a/public/audio/respiratory/crackles-coarse.ogg b/public/audio/respiratory/crackles-coarse.ogg new file mode 100644 index 0000000..fcc5502 Binary files /dev/null and b/public/audio/respiratory/crackles-coarse.ogg differ diff --git a/public/audio/respiratory/crackles-fine.ogg b/public/audio/respiratory/crackles-fine.ogg new file mode 100644 index 0000000..c582c4d Binary files /dev/null and b/public/audio/respiratory/crackles-fine.ogg differ diff --git a/public/audio/respiratory/stridor.ogg b/public/audio/respiratory/stridor.ogg new file mode 100644 index 0000000..5fe7026 Binary files /dev/null and b/public/audio/respiratory/stridor.ogg differ diff --git a/public/audio/respiratory/wheeze.ogg b/public/audio/respiratory/wheeze.ogg new file mode 100644 index 0000000..adfde87 Binary files /dev/null and b/public/audio/respiratory/wheeze.ogg differ diff --git a/public/images/pe-guide/aptm.png b/public/images/pe-guide/aptm.png new file mode 100644 index 0000000..4694b9b Binary files /dev/null and b/public/images/pe-guide/aptm.png differ diff --git a/public/js/peGuide.js b/public/js/peGuide.js index 94100a7..5c97a46 100644 --- a/public/js/peGuide.js +++ b/public/js/peGuide.js @@ -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: '4th–5th 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: '4th–5th ICS, lower left sternal border', listen: 'Tricuspid regurgitation, VSD, S3/S4, holosystolic murmurs', + innocent: 'Still\'s murmur — vibratory, musical, age 3–7 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: '3–7 y (most common in children)', + location: 'LLSB, radiating to apex', + character: 'Low-frequency vibratory / musical systolic, grade 2–3/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 (2nd–3rd ICS)', + character: 'Soft blowing early systolic ejection, grade 1–2/6, higher-pitched', + confirm: 'No ejection click. Physiologic split of S2. Louder supine, softer on standing. No radiation.' }, + { name: 'Venous hum', + age: 'Ages 3–8, 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 2–3/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 < 6–12 months', + location: 'Upper LSB, radiates to BOTH axillae and the back', + character: 'Soft systolic ejection murmur, grade 1–2/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: '40–60 /min; tachypnea > 60' }, + { label: 'Work of breathing (Silverman)', method: 'Inspect for upper-chest retraction, lower-chest retraction, xiphoid retraction, nasal flaring, grunting. Score 0–2 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 (48–72 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 24–48 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; 2–12 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 mo–6 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 mo–6 y classical age), foreign-body aspiration (age 1–3 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 (6–11 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 3–5 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 1–6 (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 += '
' + esc(section.overview) + '
'; html += ''; - // ─ APTM cardiac auscultation diagram (only for cv system) ─ + // ─ APTM cardiac auscultation diagram + innocent-murmur map (cv only) ─ if (currentSystem === 'cv') { html += '
'; html += '

Auscultation landmarks — APTM + Erb\'s

'; - html += '
'; - html += '
' + APTM_SVG + '
'; + html += '
'; + html += '
APTM cardiac auscultation points diagram
'; html += '
'; APTM_LEGEND.forEach(function (p) { html += '
'; @@ -1121,11 +1394,30 @@ html += '
' + esc(p.title) + '
'; html += '
' + esc(p.location) + '
'; html += '
Listen for: ' + esc(p.listen) + '
'; + if (p.innocent) { + html += '
Innocent murmur(s): ' + esc(p.innocent) + '
'; + } html += '
'; html += '
'; }); html += '
'; html += '
'; + + // ─ Innocent murmur reference panel ─ + html += '
'; + html += '
Classic innocent murmurs (benign, no workup needed)
'; + html += '
'; + INNOCENT_MURMURS.forEach(function (m) { + html += '
'; + html += '
' + esc(m.name) + '
'; + html += '
Age: ' + esc(m.age) + ' · Location: ' + esc(m.location) + '
'; + html += '
Sound: ' + esc(m.character) + '
'; + html += '
Confirm innocent: ' + esc(m.confirm) + '
'; + html += '
'; + }); + html += '
'; + html += '
The 7 "S" innocent-murmur criteria: 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.
'; + html += '
'; html += '
'; } diff --git a/public/js/respiratorySounds.js b/public/js/respiratorySounds.js index 4b9c208..e7ba1e8 100644 --- a/public/js/respiratorySounds.js +++ b/public/js/respiratorySounds.js @@ -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) };