diff --git a/public/components/pe-guide.html b/public/components/pe-guide.html index ff4f3d9..3b95379 100644 --- a/public/components/pe-guide.html +++ b/public/components/pe-guide.html @@ -51,6 +51,9 @@ +
diff --git a/public/js/peGuide.js b/public/js/peGuide.js index 237f7aa..94100a7 100644 --- a/public/js/peGuide.js +++ b/public/js/peGuide.js @@ -112,15 +112,104 @@ ['6–11', 'Severe — admit, continuous monitoring'], ['≥ 12', 'Impending respiratory failure — ICU / airway management'] ] + }, + murmurGrade: { + title: 'Heart-murmur grading (Levine 1–6)', + icon: 'fa-wave-square', + rows: [ + ['1/6', 'Very faint — heard only with concentration'], + ['2/6', 'Soft but readily heard'], + ['3/6', 'Moderately loud, no thrill'], + ['4/6', 'Loud WITH a palpable thrill'], + ['5/6', 'Very loud; audible with stethoscope just off the chest'], + ['6/6', 'Audible without the stethoscope touching the chest'] + ] + }, + pulseAmp: { + title: 'Pulse amplitude grade (0–4)', + icon: 'fa-heart-pulse', + rows: [ + ['0', 'Absent'], + ['1+', 'Diminished, thready'], + ['2+', 'Normal'], + ['3+', 'Bounding'], + ['4+', 'Bounding with visible pulsation (e.g., aortic regurgitation)'] + ] + }, + capRefill: { + title: 'Capillary refill time', + icon: 'fa-hand', + rows: [ + ['< 2 sec', 'Normal'], + ['2–3 sec', 'Borderline — consider hydration / perfusion'], + ['≥ 3 sec', 'Delayed — dehydration, shock, low cardiac output'] + ] } }; // Which scales are relevant per system var SYSTEM_SCALES = { msk: ['atr', 'beighton'], neuro: ['mrc', 'dtr', 'plantar'], - resp: ['rr', 'spo2', 'silverman', 'westley'] + resp: ['rr', 'spo2', 'silverman', 'westley'], + cv: ['murmurGrade', 'pulseAmp', 'capRefill'] }; + // ──────────────────────────────────────────────────────────── + // APTM DIAGRAM — the 5 classic auscultation points + // ──────────────────────────────────────────────────────────── + // Inline SVG showing: Aortic, Pulmonic, Erb's, Tricuspid, Mitral. + // Rendered at the top of the cardiovascular system view. + // Patient faces viewer — viewer's LEFT = patient's right. + var APTM_SVG = + '' + + // Chest outline + '' + + // Clavicles + '' + + '' + + // Sternum + '' + + // ICS level dashed lines + '' + + '' + + '' + + '' + + // Midclavicular line (left — patient\'s, viewer\'s right) + '' + + // ICS labels + 'ICS 2' + + 'ICS 3' + + 'ICS 4' + + 'ICS 5' + + 'Mid-clavicular' + + // Patient labels + 'Patient\'s RIGHT' + + 'Patient\'s LEFT' + + // Aortic — 2nd ICS right sternal border (viewer\'s left) + '' + + 'A' + + // Pulmonic — 2nd ICS left sternal border (viewer\'s right) + '' + + 'P' + + // Erb\'s point — 3rd ICS left sternal border + '' + + 'E' + + // Tricuspid — 4th ICS left sternal border + '' + + 'T' + + // Mitral — 5th ICS midclavicular (apex) + '' + + 'M' + + ''; + + 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: 'M', color: '#7c3aed', title: 'Mitral area (apex)', location: '5th ICS, mid-clavicular line', listen: 'S1, mitral regurgitation, mitral stenosis (with bell, left-lateral decubitus)' } + ]; + // ──────────────────────────────────────────────────────────── // RESPIRATORY SOUNDS LIBRARY // ──────────────────────────────────────────────────────────── @@ -870,6 +959,77 @@ ], abnormalHints: ['Bronchophony increased — consolidation', 'Egophony positive ("ee" → "A" / "ay") — consolidation, sometimes top of an effusion', 'Whispered pectoriloquy positive (whisper clearly audible) — consolidation'] } ] + }, + cv: { + overview: 'Systematic cardiovascular exam: inspection → palpation → auscultation at the five classic points → peripheral vascular exam. Always palpate the apex BEFORE auscultating — knowing where the apex lies tells you where to put the stethoscope and flags cardiomegaly immediately.', + components: [ + { name: 'Inspection', + significance: 'Detects obvious precordial activity, chest-wall signs of congenital heart disease, and systemic markers (cyanosis, clubbing, dysmorphic features).', + pearl: 'Clubbing + central cyanosis in a well-appearing adolescent = cyanotic congenital heart disease until proven otherwise. Inspect the fingernails before reaching for the stethoscope.', + steps: [ + { label: 'General appearance', method: 'Observe body habitus, features suggesting syndromic CHD (Turner, Down, Marfan, Williams).', normal: 'No dysmorphic features, appropriate growth' }, + { label: 'Central cyanosis', method: 'Inspect lips, tongue, and oral mucosa for bluish discoloration.', normal: 'Pink oral mucosa, no cyanosis' }, + { label: 'Peripheral cyanosis / clubbing', method: 'Inspect nail beds; do Schamroth\'s window (oppose nails of 4th fingers — normally forms a diamond-shaped window).', normal: 'Pink nail beds, Schamroth window present' }, + { label: 'Precordial bulge', method: 'Inspect anterior chest wall tangentially for asymmetric prominence over the heart.', normal: 'Symmetric chest, no bulge' }, + { label: 'Visible apex beat', method: 'Inspect for a visible cardiac impulse at the 5th ICS mid-clavicular line.', normal: 'Apex may be visible in thin patients; should not be displaced' }, + { label: 'Neck veins (JVP)', method: 'Patient reclined 45°, head turned slightly left. Observe the right internal jugular pulsation; measure vertical height above the sternal angle.', normal: '≤ 4 cm above sternal angle (≤ 9 cm H₂O from right atrium)' } + ], + abnormalHints: ['Central cyanosis — right-to-left shunt, severe hypoxemia', 'Clubbing — cyanotic CHD, chronic hypoxemia', 'Precordial bulge — long-standing cardiomegaly (grew during skeletal growth)', 'Visible apex displaced lateral/inferior — cardiomegaly', 'Elevated JVP — right-heart failure, fluid overload, cardiac tamponade'] }, + + { name: 'Palpation', + significance: 'Localises the apex (confirms cardiac size), detects thrills (loud murmurs), and identifies a parasternal heave (RV hypertrophy).', + pearl: 'If you feel a thrill, the murmur is at least grade 4/6 — grade your murmur as ≥4 even if it sounds less impressive. Thrill = loud, palpable turbulence.', + steps: [ + { label: 'Apex beat — localise', method: 'Feel with the tips of the fingers at the 5th ICS mid-clavicular line. If not found, roll the patient to the left lateral decubitus position.', normal: 'Located at 5th ICS, mid-clavicular line, less than 2 cm in diameter' }, + { label: 'Apex character', method: 'Describe: tapping (normal), heaving (pressure overload, e.g. AS/HTN), thrusting (volume overload, e.g. AR/MR), dyskinetic (MI/aneurysm).', normal: 'Brief tapping quality' }, + { label: 'Parasternal heave', method: 'Place the heel of the hand along the left sternal border. Sustained outward movement with each systole = heave.', normal: 'No heave' }, + { label: 'Thrills', method: 'Use the palmar aspect of the hand at each of the 5 auscultation areas (A, P, E, T, M). A thrill = palpable turbulence.', normal: 'No thrills' }, + { label: 'Peripheral pulses — upper', method: 'Palpate radial pulses bilaterally, then brachial. Note rate, rhythm, volume, and symmetry.', normal: 'Symmetric 2+ pulses, regular rhythm, age-appropriate rate' }, + { label: 'Peripheral pulses — lower', method: 'Palpate femoral pulses. Compare to brachial — radio-femoral or brachio-femoral delay suggests coarctation of the aorta.', normal: 'Femoral pulses 2+ symmetric, no delay relative to radial' } + ], + abnormalHints: ['Apex displaced laterally/inferiorly — cardiomegaly', 'Heaving apex — pressure overload (AS, HTN)', 'Thrusting apex — volume overload (AR, MR)', 'Thrill over precordium — always pathological; at least grade 4/6 murmur', 'Parasternal heave — RV hypertrophy (pulmonary HTN, pulmonary stenosis, VSD with Eisenmenger)', 'Radio-femoral delay — coarctation of the aorta (always check in a hypertensive adolescent)'] }, + + { name: 'Auscultation — approach', + significance: 'Systematic technique ensures every relevant finding is detected. Listen at all 5 points, with both diaphragm and bell, in supine/sitting/left-lateral positions as needed.', + pearl: 'Time every murmur by simultaneously palpating the carotid pulse with the fingers of your free hand. Pulse = systole. Murmur heard during the pulse = systolic; in between pulses = diastolic.', + steps: [ + { label: 'Positioning', method: 'Patient supine, head of bed at 30°. Exam room quiet, patient relaxed. Warm the stethoscope first.', normal: 'N/A — technique' }, + { label: 'Diaphragm technique', method: 'Firm contact with skin. Detects HIGH-pitched sounds: S1, S2, systolic ejection murmurs, AR, MR.', normal: 'N/A — technique' }, + { label: 'Bell technique', method: 'Very light contact — enough to make a seal but not stretch the skin. Detects LOW-pitched sounds: S3, S4, mitral stenosis rumble.', normal: 'N/A — technique' }, + { label: 'Listen at each of the 5 points', method: 'A → P → E → T → M in order, each with diaphragm then bell. Spend a full cycle at each zone.', normal: 'S1 crisp, S2 clear (splits physiologically on inspiration at P), no added sounds, no murmur' }, + { label: 'Left lateral decubitus position', method: 'If apex murmur suspected. Roll patient to left side. Listen at the apex with the BELL for mitral stenosis rumble or S3/S4.', normal: 'No added sounds, no diastolic rumble' }, + { label: 'Sitting forward, held expiration', method: 'Patient leans forward, exhales fully, holds. Listen at left lower sternal border and Erb\'s point with the DIAPHRAGM for aortic regurgitation (soft early diastolic decrescendo).', normal: 'No early-diastolic murmur' } + ], + abnormalHints: ['Fixed split S2 (no change with respiration) — ASD', 'Loud S2 at pulmonic area — pulmonary HTN', 'S3 — volume overload, CHF (can be normal in young athletes)', 'S4 — stiff ventricle (HTN, HCM, ischemia)', 'Audible opening snap — mitral stenosis (rare in children)'] }, + + { name: 'Auscultation — heart sounds and murmurs', + significance: 'Characterising a murmur by timing, location, radiation, pitch, quality, and dynamic maneuvers narrows the differential.', + pearl: 'Innocent murmurs in children share 7 "S" features: Soft (≤ grade 2), Systolic, Short, Single (no added S3/S4), Small (localised, non-radiating), Sweet (musical), Sensitive to position/respiration (louder supine, softer standing). Anything breaking this pattern deserves workup.', + steps: [ + { label: 'S1', method: 'Listen at the apex (mitral). Coincides with the carotid pulse upstroke. Mitral + tricuspid closure.', normal: 'Single, crisp, single-component sound' }, + { label: 'S2', method: 'Listen at the pulmonic area in HELD INSPIRATION and HELD EXPIRATION. Note whether S2 splits physiologically (wider in inspiration, narrower/absent in expiration).', normal: 'Physiologic split (widens on inspiration, narrows on expiration)' }, + { label: 'S3 / S4 gallops', method: 'Bell at the apex in left lateral decubitus. S3 = early diastole (after S2), low-pitched. S4 = late diastole (just before S1).', normal: 'Absent in adults; S3 can be normal in young athletes under age 30' }, + { label: 'Identify murmur — timing', method: 'Time vs carotid pulse. Systolic (during pulse) vs diastolic (between pulses) vs continuous.', normal: 'No murmur, or only soft innocent flow murmur' }, + { label: 'Identify murmur — location + radiation', method: 'Where loudest? Does it radiate? AS → carotids. MR → axilla. Coarctation → back.', normal: 'N/A — characterise only if murmur present' }, + { label: 'Identify murmur — character', method: 'Crescendo-decrescendo (ejection) vs holosystolic (plateau) vs decrescendo early-diastolic (AR, PR) vs mid-diastolic rumble (MS, TS).', normal: 'N/A — characterise only if murmur present' }, + { label: 'Grade intensity', method: 'Levine 1–6 scale (see scales card above).', normal: 'No murmur, or grade ≤ 2 soft innocent flow murmur' }, + { label: 'Dynamic maneuvers', method: 'Standing: ↑HOCM, ↑MVP click (earlier). Squatting: opposite. Valsalva: ↑HOCM, most others decrease.', normal: 'No significant change with posture' } + ], + abnormalHints: ['Holosystolic murmur at apex → axilla — mitral regurgitation', 'Holosystolic at lower left sternal border (LLSB) — VSD, tricuspid regurgitation', 'Systolic ejection at upper right sternal border → carotids — aortic stenosis', 'Systolic ejection at upper left sternal border — pulmonary stenosis', 'Continuous "machinery" below left clavicle — PDA', 'Early diastolic at Erb\'s point, leaning forward — aortic regurgitation', 'Diastolic rumble at apex, bell in left-lateral — mitral stenosis', 'Fixed split S2 + systolic flow murmur — ASD'] }, + + { name: 'Peripheral vascular exam', + significance: 'Coarctation of the aorta hides until BP and pulses are checked in all four extremities. Differential diagnosis of a hypertensive adolescent should include this in the first 60 seconds.', + pearl: 'Four-limb BP measurement is mandatory in any adolescent with hypertension or a murmur. Upper-extremity BP > lower-extremity BP (or brachio-femoral delay) = coarctation until excluded.', + steps: [ + { label: 'Four-limb blood pressure', method: 'Measure BP in right arm, left arm, and at least one leg. Use appropriately sized cuff (bladder width 40% of limb circumference, length 80–100%).', normal: 'Arm BPs within 10 mmHg of each other; leg systolic within 20 mmHg of arm systolic (may be higher)' }, + { label: 'Radial pulses', method: 'Palpate both radials simultaneously — note any delay or asymmetry.', normal: 'Simultaneous, symmetric, 2+' }, + { label: 'Radio-femoral delay', method: 'Palpate radial and femoral simultaneously. Feel the femoral as clearly "after" the radial = delay.', normal: 'No delay' }, + { label: 'Femoral pulses', method: 'Palpate both femoral pulses at the mid-inguinal point. Compare amplitude to radials.', normal: 'Symmetric 2+ pulses, equal amplitude to radial' }, + { label: 'Dorsalis pedis + posterior tibialis', method: 'Palpate in both feet.', normal: '2+ pulses bilaterally' }, + { label: 'Capillary refill', method: 'Press and release the nail bed; time to normal colour.', normal: '< 2 sec' } + ], + abnormalHints: ['Asymmetric upper-extremity BP (> 10 mmHg) — subclavian stenosis or coarctation at the origin', 'Upper >> lower-extremity BP — coarctation of the aorta', 'Diminished or absent femoral pulses with brachio-femoral delay — coarctation', 'Bounding pulses with wide pulse pressure — AR, PDA, arteriovenous fistula, thyrotoxicosis, anemia', 'Weak thready pulses — low output state (heart failure, shock, hypovolemia)', 'Prolonged capillary refill — dehydration, shock, cold stress'] } + ] } } }; @@ -931,10 +1091,10 @@ return; } var section = group[currentSystem]; - var accentMap = { msk: '#0891b2', neuro: '#7c3aed', resp: '#0ea5e9' }; // cyan / purple / sky - var accentTintMap = { msk: '#ecfeff', neuro: '#f5f3ff', resp: '#f0f9ff' }; - var iconMap = { msk: 'bone', neuro: 'brain', resp: 'lungs' }; - var labelMap = { msk: 'Musculoskeletal', neuro: 'Neurologic', resp: 'Respiratory' }; + var accentMap = { msk: '#0891b2', neuro: '#7c3aed', resp: '#0ea5e9', cv: '#e11d48' }; // cyan / purple / sky / rose + var accentTintMap = { msk: '#ecfeff', neuro: '#f5f3ff', resp: '#f0f9ff', cv: '#fff1f2' }; + var iconMap = { msk: 'bone', neuro: 'brain', resp: 'lungs', cv: 'heart-pulse' }; + var labelMap = { msk: 'Musculoskeletal', neuro: 'Neurologic', resp: 'Respiratory', cv: 'Cardiovascular' }; var accent = accentMap[currentSystem] || '#0891b2'; var accentTint = accentTintMap[currentSystem] || '#ecfeff'; var icon = iconMap[currentSystem] || 'circle-info'; @@ -947,6 +1107,28 @@ html += '
' + esc(section.overview) + '
'; html += '
'; + // ─ APTM cardiac auscultation diagram (only for cv system) ─ + if (currentSystem === 'cv') { + html += '
'; + html += '

Auscultation landmarks — APTM + Erb\'s

'; + html += '
'; + html += '
' + APTM_SVG + '
'; + html += '
'; + APTM_LEGEND.forEach(function (p) { + html += '
'; + html += '
' + p.letter + '
'; + html += '
'; + html += '
' + esc(p.title) + '
'; + html += '
' + esc(p.location) + '
'; + html += '
Listen for: ' + esc(p.listen) + '
'; + html += '
'; + html += '
'; + }); + html += '
'; + html += '
'; + html += '
'; + } + // ─ Respiratory sounds library (only for resp system) ─ if (currentSystem === 'resp') { html += '
';