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:
parent
32d6dae7a5
commit
a3be6bad29
10 changed files with 331 additions and 7 deletions
BIN
public/audio/cardiac/mitral-prolapse.wav
Normal file
BIN
public/audio/cardiac/mitral-prolapse.wav
Normal file
Binary file not shown.
BIN
public/audio/cardiac/normal.ogg
Normal file
BIN
public/audio/cardiac/normal.ogg
Normal file
Binary file not shown.
BIN
public/audio/cardiac/vsd.wav
Normal file
BIN
public/audio/cardiac/vsd.wav
Normal file
Binary file not shown.
BIN
public/audio/respiratory/crackles-coarse.ogg
Normal file
BIN
public/audio/respiratory/crackles-coarse.ogg
Normal file
Binary file not shown.
BIN
public/audio/respiratory/crackles-fine.ogg
Normal file
BIN
public/audio/respiratory/crackles-fine.ogg
Normal file
Binary file not shown.
BIN
public/audio/respiratory/stridor.ogg
Normal file
BIN
public/audio/respiratory/stridor.ogg
Normal file
Binary file not shown.
BIN
public/audio/respiratory/wheeze.ogg
Normal file
BIN
public/audio/respiratory/wheeze.ogg
Normal file
Binary file not shown.
BIN
public/images/pe-guide/aptm.png
Normal file
BIN
public/images/pe-guide/aptm.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 131 KiB |
|
|
@ -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 += ' <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>';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue