Qualitative and quantitative sounds on auscultation in respiratory examination according to golwalla .

Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Searching the Web

Golwalla Medicine auscultation respiratory qualitative quantitative sounds

Reading File
Finding Sources
Reading File
The file has moved past the auscultation section. The earlier read (offset 3660-3780) gave me everything I need - the complete table, all normal and adventitious sounds, and voice sounds. Now I have comprehensive content to provide a full, well-organized answer based on Golwalla's classification (which I know well from training) supplemented by the authoritative Murray & Nadel textbook content. Let me compose the answer.

Note: Golwalla's Medicine for Students is not available in this library's textbook collection. However, the framework Golwalla uses - dividing auscultatory sounds into qualitative (type/character of the sound) and quantitative (intensity/amount) - is a classic Indian medical textbook classification that I can reproduce accurately from knowledge, cross-referenced with Murray & Nadel's Textbook of Respiratory Medicine.

Auscultation of the Chest - Sounds in Respiratory Examination (Golwalla)

Golwalla classifies sounds heard on auscultation into two broad categories:
  1. Quantitative changes - changes in the intensity of breath sounds (more or less than normal)
  2. Qualitative changes - changes in the character or type of the sound

A. BREATH SOUNDS (Normal)

Types of Normal Breath Sounds

SoundSite Normally HeardCharacterI:E Ratio
VesicularOver most of lung fieldsSoft, low-pitched, rustling ("breeze through leaves"); inspiratory > expiratory with no pauseInsp: Exp = 3:1
Bronchial (Tubular)Over trachea & manubrium sterniLoud, high-pitched, hollow/blowing; expiratory > inspiratory; gap between I & EInsp: Exp = 1:2
Bronchovesicular1st & 2nd ICS anteriorly; between scapulae posteriorlyIntermediate character; I = E with short pauseInsp: Exp = 1:1

B. QUANTITATIVE CHANGES IN BREATH SOUNDS

These refer to changes in the loudness/intensity of normal breath sounds.

1. Diminished / Decreased Breath Sounds

Breath sounds are softer than normal. Causes:
  • Pleural effusion - fluid absorbs sound
  • Pneumothorax - air in pleural space
  • Pleural thickening
  • Emphysema - reduced airflow + air trapping
  • Obesity / thick chest wall
  • Bronchial obstruction (mucus plug, tumour) - reduced airflow
  • Atelectasis (obstructive type)

2. Absent Breath Sounds

Complete absence of breath sounds - seen in:
  • Large pleural effusion
  • Complete pneumothorax
  • Complete bronchial obstruction

3. Increased / Accentuated Breath Sounds

Breath sounds louder than normal, heard over an area:
  • Consolidation - the consolidated (airless but patent airway) lung transmits sound better, causing breath sounds in adjacent normal areas to appear relatively louder
  • Over compressed lung - lung compressed above a moderate pleural effusion

4. Bronchial Breathing in Abnormal Sites

When bronchial breath sounds are heard over peripheral lung fields (where vesicular sounds are normal), it is pathological. This is the most important qualitative-quantitative crossover finding.
Causes of abnormal bronchial breathing:
  • Consolidation (e.g., lobar pneumonia) - most common
  • Collapse with patent bronchus
  • Lung abscess with open cavity
  • Above a pleural effusion (compressed lung)
  • Pleural thickening (occasionally)
  • Large bronchiectatic cavity
Types of bronchial breathing:
  • Tubular - over consolidation
  • Cavernous - loud, hollow, low-pitched; over a large cavity (lung abscess, TB cavitation)
  • Amphoric - metallic, "blowing over a bottle"; over a large smooth-walled cavity/pneumothorax with bronchopleural fistula

C. QUALITATIVE CHANGES - ADVENTITIOUS SOUNDS

These are sounds added to or superimposed on normal or abnormal breath sounds. They are not normally present.

Classification

Adventitious sounds are divided into:
  • Non-continuous (Interrupted) - Crepitations / Crackles / Rales
  • Continuous (Musical) - Rhonchi (wheezes, sibilant/sonorous)

1. Crepitations (Crackles / Rales)

Short, explosive, non-musical, interrupted sounds.
Mechanism: Sudden opening of collapsed small airways or alveoli, or movement of secretions in airways.
TypeCharacterTimingCauses
Fine (moist) crepitationsSoft, high-pitched, crackling ("rubbing hair near ear")Late inspiratoryPulmonary fibrosis, early pulmonary oedema, pneumonia
Medium crepitationsMedium pitch and intensityMid-inspiratoryBronchiectasis, resolving pneumonia, pulmonary oedema
Coarse crepitationsLoud, low-pitched, "bubbling"Early inspiratory or expiratoryBronchiectasis, severe pulmonary oedema, bronchitis with secretions
Key clinical points:
  • Fine end-inspiratory crepitations that do not clear with coughing - suggest alveolar/interstitial disease (fibrosis, oedema)
  • Coarse early-inspiratory crepitations that change or clear with coughing - suggest secretions in larger airways

2. Rhonchi (Wheezes)

Continuous, musical sounds produced by air flowing through narrowed airways.
TypeCharacterTimingPitchCauses
Sibilant rhonchi (wheezes)High-pitched, hissing/squeaking ("squeaky door")Mainly expiratoryHighAsthma, bronchospasm, small airway obstruction
Sonorous rhonchiLow-pitched, snoring/moaningInspiratory or expiratoryLowLarge airway secretions, chronic bronchitis, COPD
Polyphonic wheeze - multiple pitches, diffuse airways disease (asthma) Monophonic wheeze - single pitch, localised obstruction (tumour, foreign body)

3. Stridor

A loud, harsh, high-pitched, inspiratory continuous sound produced by obstruction of the upper airway (extrathoracic). Heard best over the trachea/neck.
  • Causes: Laryngeal oedema, epiglottitis, croup, foreign body, tracheal tumour

4. Pleural Friction Rub

  • Character: Creaking, leathery, "walking on snow" or "rubbing two pieces of leather together"
  • Timing: Both inspiratory and expiratory; disappears when breath is held (distinguishes from pericardial rub)
  • Cause: Inflammation of parietal and visceral pleura - pleuritis (pleurisy), pulmonary infarction, TB, malignancy
  • Site: Heard best over lower lateral chest

D. VOCAL RESONANCE (Voice Sounds)

These are modifications of transmitted vocal sounds on auscultation, related to qualitative changes in lung tissue.
SignMethodNormalAbnormal findingMeaning
Vocal resonancePatient says "ninety-nine"; auscultateMuffled, indistinctIncreased (clear)Consolidation
Decreased/absentEffusion, pneumothorax
BronchophonySame as aboveIndistinctAbnormally clear and loud "ninety-nine"Consolidation
Whispering pectoriloquyPatient whispers "one-two-three"; auscultateBarely audibleClearly heard whispered wordsConsolidation (most sensitive sign)
Aegophony (Egophony)Patient says "E"; auscultateHear "E"Hear "A" (nasal bleating quality)Just above pleural effusion (compressed lung)

Summary Table: Auscultatory Findings in Common Conditions

ConditionBreath SoundsAdded SoundsVocal Resonance
ConsolidationBronchial (tubular)Fine/medium crepitationsIncreased, bronchophony, whispering pectoriloquy
Pleural effusionAbsent/reduced; bronchial just abovePleural rub (early)Absent below; aegophony at upper border
PneumothoraxAbsent/reducedAbsentAbsent/reduced
EmphysemaVesicular, reducedNone or fine cracklesReduced
Asthma (acute)Vesicular + prolonged expirationPolyphonic sibilant rhonchiNormal/reduced
Pulmonary fibrosisVesicularBilateral fine end-insp. crepitations ("Velcro")Normal
Pleural effusion (above)Bronchial (compressed lung)AegophonyIncreased just above fluid
Lung abscessCavernous/amphoricCoarse crepitationsIncreased over cavity

Source references used: Murray & Nadel's Textbook of Respiratory Medicine (Table 18.3, Chapter 18 - Physical Examination) confirms the above classification of normal breath sounds, adventitious sounds (crackles, wheezes, rhonchi, stridor), and voice sounds. The Golwalla framework of qualitative vs. quantitative sounds is standard Indian clinical medicine teaching that maps directly onto this classification.

Make a presentation on physical examination skills in respiratory assessment

Asking for Preferences
Reading File
Reading File
Reading File
Running Command

mkdir -p /home/daytona/workspace/resp-exam-pptx

Writing File

~/resp-exam-pptx/build.js

const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Physical Examination Skills in Respiratory Assessment";
pres.author = "Medical Education";

// ─── COLOUR PALETTE ───────────────────────────────────────────────────────────
const C = {
  navy:    "0B2545",   // dominant dark (60%)
  teal:    "14517C",   // supporting mid
  sky:     "1B7AC4",   // accent blue
  mint:    "00B4A6",   // accent teal/green
  white:   "FFFFFF",
  offWht:  "F0F4F8",
  pale:    "D6EAF8",
  gold:    "F4C542",
  lightGr: "E8F5F3",
  text:    "1A1A2E",
  subtext: "4A6580",
};

// ─── HELPERS ──────────────────────────────────────────────────────────────────
function addBg(slide, color) {
  slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color } });
}

function addAccentBar(slide, color = C.mint) {
  slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.25, w: 10, h: 0.375, fill: { color } });
}

function sectionTitle(slide, title, sub) {
  addBg(slide, C.navy);
  // Decorative circle left
  slide.addShape(pres.shapes.OVAL, { x: -0.8, y: -0.8, w: 3, h: 3, fill: { color: C.teal, transparency: 60 }, line: { type: "none" } });
  // Decorative circle right
  slide.addShape(pres.shapes.OVAL, { x: 8.5, y: 3.5, w: 2.5, h: 2.5, fill: { color: C.mint, transparency: 70 }, line: { type: "none" } });
  // Accent horizontal line
  slide.addShape(pres.shapes.RECTANGLE, { x: 0.6, y: 2.85, w: 1.2, h: 0.07, fill: { color: C.gold }, line: { type: "none" } });
  slide.addText(title, { x: 0.6, y: 1.7, w: 8.8, h: 0.9, fontSize: 36, bold: true, color: C.white, fontFace: "Calibri" });
  if (sub) slide.addText(sub, { x: 0.6, y: 2.95, w: 8.8, h: 0.5, fontSize: 17, color: C.pale, fontFace: "Calibri", italic: true });
}

function contentHeader(slide, title, color = C.navy) {
  slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 0.85, fill: { color } });
  slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0.85, w: 10, h: 0.05, fill: { color: C.mint } });
  slide.addText(title, { x: 0.35, y: 0.1, w: 9.3, h: 0.65, fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
}

function bulletBox(slide, items, x, y, w, h, opts = {}) {
  const textArr = items.map((item, i) => ({
    text: item,
    options: { bullet: { type: "bullet", indent: 15 }, breakLine: i < items.length - 1, fontSize: opts.fontSize || 13.5, color: opts.color || C.text, fontFace: "Calibri" }
  }));
  slide.addText(textArr, { x, y, w, h, valign: "top", margin: [4, 6, 4, 6] });
}

function card(slide, x, y, w, h, fillColor, lineColor) {
  slide.addShape(pres.shapes.ROUNDED_RECTANGLE, {
    x, y, w, h,
    fill: { color: fillColor || C.offWht },
    line: { color: lineColor || C.sky, width: 1.5 },
    rectRadius: 0.1,
    shadow: { type: "outer", color: "000000", blur: 5, offset: 2, angle: 135, opacity: 0.1 }
  });
}

function footerLine(slide, label = "") {
  slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.38, w: 10, h: 0.245, fill: { color: C.navy } });
  if (label) {
    slide.addText(label, { x: 0.3, y: 5.38, w: 9.5, h: 0.245, fontSize: 9, color: C.pale, fontFace: "Calibri", valign: "middle", margin: 0 });
  }
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.navy);

  // Large background geometric shapes
  s.addShape(pres.shapes.OVAL, { x: 6.5, y: -1.5, w: 5.5, h: 5.5, fill: { color: C.teal, transparency: 65 }, line: { type: "none" } });
  s.addShape(pres.shapes.OVAL, { x: -1.2, y: 3.5, w: 4, h: 4, fill: { color: C.sky, transparency: 75 }, line: { type: "none" } });
  s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.0, w: 10, h: 0.625, fill: { color: C.mint } });

  // Title text
  s.addText("Physical Examination Skills", {
    x: 0.6, y: 1.1, w: 8.8, h: 0.9,
    fontSize: 34, bold: true, color: C.white, fontFace: "Calibri", charSpacing: 1
  });
  s.addText("in Respiratory Assessment", {
    x: 0.6, y: 1.95, w: 8.8, h: 0.75,
    fontSize: 28, color: C.gold, fontFace: "Calibri", bold: false, charSpacing: 1
  });
  // Divider
  s.addShape(pres.shapes.RECTANGLE, { x: 0.6, y: 2.82, w: 3.5, h: 0.06, fill: { color: C.mint }, line: { type: "none" } });

  s.addText("A Comprehensive Guide for Medical Students", {
    x: 0.6, y: 3.0, w: 8.8, h: 0.45,
    fontSize: 14, color: C.pale, fontFace: "Calibri", italic: true
  });
  s.addText("Inspection • Palpation • Percussion • Auscultation", {
    x: 0.6, y: 3.55, w: 8.8, h: 0.4,
    fontSize: 12, color: C.mint, fontFace: "Calibri"
  });
  s.addText("Physical Examination Skills – Respiratory Assessment", {
    x: 0.3, y: 5.02, w: 9.5, h: 0.35, fontSize: 9, color: C.navy, fontFace: "Calibri", valign: "middle", margin: 0
  });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 2 – OVERVIEW / TABLE OF CONTENTS
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Overview of Respiratory Physical Examination");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  const steps = [
    ["01", "General Inspection", "Breathing pattern, cyanosis, clubbing, shape of chest"],
    ["02", "Inspection of the Chest", "Static & dynamic deformities, respiratory movements"],
    ["03", "Palpation", "Tracheal position, chest expansion, tactile vocal fremitus"],
    ["04", "Percussion", "Resonant, dull, stony dull, hyper-resonant, tympanitic"],
    ["05", "Auscultation – Breath Sounds", "Vesicular, bronchial, bronchovesicular types"],
    ["06", "Auscultation – Added Sounds", "Crepitations, rhonchi, pleural rub, stridor"],
    ["07", "Vocal Resonance", "Bronchophony, whispering pectoriloquy, aegophony"],
    ["08", "Common Conditions at a Glance", "Consolidated findings for key diagnoses"],
  ];

  const rowH = 0.52;
  const startY = 1.0;
  steps.forEach(([num, title, desc], i) => {
    const y = startY + i * rowH;
    const bg = i % 2 === 0 ? C.white : C.pale;
    s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 9.3, h: rowH - 0.04, fill: { color: bg }, line: { type: "none" } });
    // number badge
    s.addShape(pres.shapes.OVAL, { x: 0.38, y: y + 0.07, w: 0.38, h: 0.38, fill: { color: C.sky }, line: { type: "none" } });
    s.addText(num, { x: 0.38, y: y + 0.07, w: 0.38, h: 0.38, fontSize: 8.5, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri", margin: 0 });
    s.addText(title, { x: 0.84, y: y + 0.04, w: 2.8, h: 0.22, fontSize: 12, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
    s.addText(desc, { x: 0.84, y: y + 0.26, w: 8.5, h: 0.2, fontSize: 10, color: C.subtext, fontFace: "Calibri", margin: 0 });
  });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 3 – GENERAL INSPECTION
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Step 1 — General Inspection");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  // Left column
  card(s, 0.35, 1.0, 4.3, 2.0, C.white, C.sky);
  s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 4.3, h: 0.38, fill: { color: C.sky }, line: { type: "none" } });
  s.addText("Breathing Pattern", { x: 0.45, y: 1.0, w: 4.1, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
  bulletBox(s, [
    "Rate: Normal 12–20/min",
    "Tachypnoea (>20) / Bradypnoea (<12)",
    "Cheyne-Stokes: crescendo-decrescendo cycles + apnoea",
    "Kussmaul: deep, rapid (metabolic acidosis)",
    "Biot's: irregular with apnoea (raised ICP)",
  ], 0.45, 1.42, 4.1, 1.5, { fontSize: 12 });

  // Right column
  card(s, 4.85, 1.0, 4.8, 2.0, C.white, C.mint);
  s.addShape(pres.shapes.RECTANGLE, { x: 4.85, y: 1.0, w: 4.8, h: 0.38, fill: { color: C.mint }, line: { type: "none" } });
  s.addText("Peripheral Signs", { x: 4.95, y: 1.0, w: 4.6, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
  bulletBox(s, [
    "Cyanosis — Central (tongue) vs Peripheral",
    "Clubbing — respiratory causes: fibrosis, Ca, empyema",
    "Flap (asterixis) — CO₂ retention (type 2 RF)",
    "Nicotine staining / tar deposits on fingers",
    "JVP — raised in cor pulmonale / SVC obstruction",
  ], 4.95, 1.42, 4.6, 1.5, { fontSize: 12 });

  // Bottom row
  card(s, 0.35, 3.15, 9.3, 1.85, C.white, C.teal);
  s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 3.15, w: 9.3, h: 0.38, fill: { color: C.teal }, line: { type: "none" } });
  s.addText("Other General Inspection Points", { x: 0.45, y: 3.15, w: 9.1, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
  const row3 = [
    "Facial appearance (Horner's syndrome — ptosis, miosis, anhydrosis)",
    "Voice: hoarseness (recurrent laryngeal nerve palsy, malignancy)",
    "Sputum pot: character of sputum (mucoid, purulent, blood-stained, rusty)",
    "Inhalers / O₂ at bedside — clue to underlying condition",
  ];
  const rowTextArr3 = row3.map((t, i) => ({
    text: t,
    options: { bullet: { type: "bullet", indent: 15 }, breakLine: i < row3.length - 1, fontSize: 12, color: C.text, fontFace: "Calibri" }
  }));
  s.addText(rowTextArr3, { x: 0.5, y: 3.58, w: 9.1, h: 1.3, valign: "top", margin: [2, 6, 2, 6] });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 4 – CHEST INSPECTION
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Step 2 — Inspection of the Chest");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  // Static deformities
  card(s, 0.35, 1.0, 4.3, 2.25, C.white, C.sky);
  s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 4.3, h: 0.38, fill: { color: C.sky }, line: { type: "none" } });
  s.addText("Static (Structural) Deformities", { x: 0.45, y: 1.0, w: 4.1, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
  bulletBox(s, [
    "Barrel chest — COPD/emphysema (↑ AP diameter, Hoover's sign)",
    "Pectus excavatum — funnel chest (depressed sternum)",
    "Pectus carinatum — pigeon chest (forward sternum)",
    "Harrison's sulcus — childhood asthma/rickets",
    "Kyphosis/Scoliosis — restrictive lung disease",
    "Gibbus deformity — TB of spine",
  ], 0.45, 1.42, 4.1, 1.75, { fontSize: 11.5 });

  // Dynamic movements
  card(s, 4.85, 1.0, 4.8, 2.25, C.white, C.mint);
  s.addShape(pres.shapes.RECTANGLE, { x: 4.85, y: 1.0, w: 4.8, h: 0.38, fill: { color: C.mint }, line: { type: "none" } });
  s.addText("Dynamic (Movement) Observations", { x: 4.95, y: 1.0, w: 4.6, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
  bulletBox(s, [
    "Symmetry of chest movement",
    "Unilateral lagging — pneumonia, effusion, collapse, fibrosis",
    "Use of accessory muscles (SCM, scalene, trapezius) — respiratory distress",
    "Intercostal recession — airway obstruction / children",
    "Subcostal recession — severe distress",
    "Paradoxical movement — flail chest (multiple rib fractures)",
  ], 4.95, 1.42, 4.6, 1.75, { fontSize: 11.5 });

  // Bottom note
  card(s, 0.35, 3.4, 9.3, 1.65, C.lightGr, C.teal);
  s.addText("KEY CLINICAL TIP", { x: 0.55, y: 3.5, w: 2.5, h: 0.32, fontSize: 11, bold: true, color: C.teal, fontFace: "Calibri", margin: 0 });
  s.addText(
    "Always inspect the chest from the end of the bed FIRST before moving closer. " +
    "Observe anterior chest, lateral aspects, and posterior chest systematically. " +
    "Note any skin changes — scars (previous surgery, drain sites), dilated veins (SVC obstruction), skin lesions (neurofibromatosis), " +
    "and chest wall asymmetry at rest and during breathing.",
    { x: 0.55, y: 3.85, w: 9.0, h: 1.1, fontSize: 12, color: C.text, fontFace: "Calibri" }
  );
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 5 – PALPATION
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Step 3 — Palpation");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  // 3 cards in a row
  const items3 = [
    {
      title: "Tracheal Position",
      color: C.sky,
      bullets: [
        "Index finger in suprasternal notch",
        "Central = normal",
        "Displaced TOWARDS lesion: collapse, fibrosis",
        "Displaced AWAY from lesion: tension pneumothorax, large effusion",
        "Check cricosternal distance (≥3 finger-widths normal)",
      ]
    },
    {
      title: "Chest Expansion",
      color: C.teal,
      bullets: [
        "Hands flat on posterior chest, thumbs raised horizontally",
        "Ask patient to take deep breath",
        "Thumbs move ≥5 cm bilaterally = normal",
        "Reduced bilaterally: COPD, fibrosis, bilateral consolidation",
        "Reduced unilaterally: effusion, collapse, pneumothorax, consolidation",
        "Repeat anteriorly (apices) and at base",
      ]
    },
    {
      title: "Vocal / Tactile Fremitus",
      color: C.mint,
      bullets: [
        "Ulnar edge of hand on chest wall",
        "Ask patient to say 'ninety-nine' / '99'",
        "Normal: vibration transmitted to hand",
        "Increased: consolidation (solid conducts better)",
        "Decreased: effusion, pneumothorax, thick chest wall, pleural thickening",
        "Absent: large effusion, complete pneumothorax",
      ]
    },
  ];

  items3.forEach(({ title, color, bullets }, i) => {
    const x = 0.28 + i * 3.2;
    card(s, x, 1.0, 3.1, 4.08, C.white, color);
    s.addShape(pres.shapes.RECTANGLE, { x, y: 1.0, w: 3.1, h: 0.38, fill: { color }, line: { type: "none" } });
    s.addText(title, { x: x + 0.1, y: 1.0, w: 2.9, h: 0.38, fontSize: 12.5, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
    bulletBox(s, bullets, x + 0.15, 1.42, 2.85, 3.5, { fontSize: 11 });
  });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 6 – PERCUSSION
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Step 4 — Percussion");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  // Technique box
  card(s, 0.35, 1.0, 3.5, 1.35, C.white, C.sky);
  s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 3.5, h: 0.34, fill: { color: C.sky }, line: { type: "none" } });
  s.addText("Technique", { x: 0.45, y: 1.0, w: 3.3, h: 0.34, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
  bulletBox(s, [
    "Place middle finger (pleximeter) firmly on chest",
    "Strike middle phalanx with middle finger of other hand",
    "Strike with wrist movement — 2 quick strokes",
    "Compare side-to-side at each level",
  ], 0.45, 1.38, 3.3, 0.9, { fontSize: 11.5 });

  // Table of percussion notes
  const notes = [
    ["Note", "Quality", "Conditions", "Colour"],
    ["Resonant", "Hollow, drum-like", "Normal lung", C.sky],
    ["Dull", "Thud-like, short", "Consolidation, lung collapse, pleural thickening", C.teal],
    ["Stony Dull", "Extremely flat/dull", "Pleural effusion (most dull)", "2C5F7E"],
    ["Hyper-resonant", "Loud, booming, prolonged", "Pneumothorax, emphysema, large bulla", "1A8A6B"],
    ["Tympanitic", "Drum-like, very high pitched", "Large pneumothorax (with open communication), Traube's space", C.gold],
  ];

  const tblW = 9.3;
  const tblX = 0.35;
  const startY = 2.45;
  const rowH = 0.525;

  notes.forEach(([note, quality, condition, color], i) => {
    const y = startY + i * rowH;
    const bg = i === 0 ? C.navy : i % 2 === 0 ? C.pale : C.white;
    s.addShape(pres.shapes.RECTANGLE, { x: tblX, y, w: tblW, h: rowH, fill: { color: bg }, line: { type: "none" } });
    if (i > 0) {
      s.addShape(pres.shapes.RECTANGLE, { x: tblX + 0.08, y: y + 0.13, w: 0.2, h: 0.25, fill: { color }, line: { type: "none" } });
    }
    const colXs = [0.45, 2.15, 3.85];
    const colWs = [1.55, 1.6, 5.5];
    const colValues = i === 0 ? [note, quality, condition] : [note, quality, condition];
    colValues.forEach((val, j) => {
      s.addText(val, {
        x: tblX + colXs[j], y: y + 0.04,
        w: colWs[j], h: rowH - 0.08,
        fontSize: i === 0 ? 11.5 : 11,
        bold: i === 0,
        color: i === 0 ? C.white : C.text,
        fontFace: "Calibri",
        valign: "middle", margin: 0,
        wrap: true,
      });
    });
  });

  // Special percussion signs note
  s.addText("Special Signs: Traube's space (L lower chest) — normally resonant; dull = splenomegaly / large left effusion.  Bird-dull area = liver dullness starts at 5th ICS (R).", {
    x: 0.35, y: 5.1, w: 9.3, h: 0.3, fontSize: 9.5, color: C.subtext, fontFace: "Calibri", italic: true
  });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 7 – AUSCULTATION INTRO + TECHNIQUE
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Step 5 — Auscultation: Technique & Normal Sounds");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  // Technique
  card(s, 0.35, 1.0, 4.55, 2.1, C.white, C.sky);
  s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 4.55, h: 0.38, fill: { color: C.sky }, line: { type: "none" } });
  s.addText("Technique", { x: 0.45, y: 1.0, w: 4.35, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
  bulletBox(s, [
    "Use diaphragm of stethoscope (directly on skin)",
    "Patient breathes deeply through open mouth",
    "Auscultate apex to base, comparing side-to-side",
    "Listen both anteriorly AND posteriorly",
    "Include axillary regions (RML, Lingula)",
    "Listen for at least one full breath at each site",
    "Note: quality, intensity, timing (insp/exp), any added sounds",
  ], 0.45, 1.42, 4.35, 1.6, { fontSize: 11.5 });

  // Normal sounds table
  const tableData = [
    ["Sound", "Site", "Character", "I:E Ratio"],
    ["Vesicular\n(Normal)", "Peripheral lung fields", "Soft, low-pitched rustling; insp > exp; no gap", "3:1"],
    ["Bronchovesicular", "1st/2nd ICS anteriorly;\nBetween scapulae", "Intermediate; medium pitch; insp ≈ exp; short gap", "1:1"],
    ["Bronchial\n(Tubular)", "Over trachea &\nmanubrium sterni", "Loud, high-pitched, hollow; exp > insp; gap between insp & exp", "1:2"],
    ["Tracheal", "Suprasternal notch\nover trachea", "Loud, harsh; heard both phases equally; broadest frequency range", "1:1"],
  ];

  const colXs = [4.98, 6.0, 7.3, 9.45];
  const colWs = [0.95, 1.25, 2.1, 0.6];
  const tblY = 1.0;
  const rowH = 0.68;

  tableData.forEach(([c0, c1, c2, c3], i) => {
    const y = tblY + i * rowH;
    const bg = i === 0 ? C.navy : i % 2 === 0 ? C.pale : C.white;
    s.addShape(pres.shapes.RECTANGLE, { x: 4.9, y, w: 4.8, h: rowH, fill: { color: bg }, line: { type: "none" } });
    [[c0, 4.98, 0.95], [c1, 5.97, 1.28], [c2, 7.28, 2.12], [c3, 9.44, 0.5]].forEach(([txt, x, w]) => {
      s.addText(txt, {
        x, y: y + 0.03, w, h: rowH - 0.06,
        fontSize: i === 0 ? 10.5 : 10, bold: i === 0,
        color: i === 0 ? C.white : C.text,
        fontFace: "Calibri", valign: "middle", wrap: true, margin: [2, 3, 2, 3]
      });
    });
  });

  // Differential note
  card(s, 0.35, 3.18, 9.3, 1.5, C.lightGr, C.teal);
  s.addText("Abnormal Bronchial Breathing (in Peripheral Sites)", {
    x: 0.5, y: 3.22, w: 9.0, h: 0.3, fontSize: 12, bold: true, color: C.teal, fontFace: "Calibri", margin: 0
  });
  const abnormalB = [
    "Tubular — consolidation (lobar pneumonia)",
    "Cavernous — lung abscess / large TB cavity (louder, lower, more hollow)",
    "Amphoric — large smooth-walled cavity / bronchopleural fistula (metallic, 'blowing over bottle')",
  ];
  bulletBox(s, abnormalB, 0.5, 3.56, 9.0, 1.05, { fontSize: 11.5, color: C.text });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 8 – QUANTITATIVE CHANGES IN BREATH SOUNDS
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Auscultation — Quantitative Changes in Breath Sounds");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  const qCards = [
    {
      title: "Diminished / Reduced",
      color: C.teal,
      items: [
        "Pleural effusion — fluid absorbs sound",
        "Pneumothorax — air in pleural space",
        "Emphysema — air trapping, reduced airflow",
        "Obesity / thick chest wall",
        "Bronchial obstruction (tumour, mucus plug)",
        "Pleural thickening"
      ]
    },
    {
      title: "Absent",
      color: "B03A2E",
      items: [
        "Large pleural effusion",
        "Complete pneumothorax",
        "Complete bronchial obstruction",
        "Post-pneumonectomy"
      ]
    },
    {
      title: "Increased / Accentuated",
      color: "1A8A6B",
      items: [
        "Over compressed lung above effusion",
        "Compensatory areas adjacent to collapse",
        "Note: usually heard as bronchial breathing, not just 'louder vesicular'"
      ]
    }
  ];

  qCards.forEach(({ title, color, items }, i) => {
    const x = 0.28 + i * 3.2;
    card(s, x, 1.0, 3.1, 2.6, C.white, color);
    s.addShape(pres.shapes.RECTANGLE, { x, y: 1.0, w: 3.1, h: 0.38, fill: { color }, line: { type: "none" } });
    s.addText(title, { x: x + 0.1, y: 1.0, w: 2.9, h: 0.38, fontSize: 12.5, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
    bulletBox(s, items, x + 0.12, 1.42, 2.85, 2.1, { fontSize: 11 });
  });

  // Reminder box
  card(s, 0.35, 3.75, 9.3, 1.52, C.white, C.gold);
  s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 3.75, w: 9.3, h: 0.34, fill: { color: "B8860B" }, line: { type: "none" } });
  s.addText("Memory Aid — Causes of Reduced / Absent Breath Sounds", {
    x: 0.45, y: 3.75, w: 9.1, h: 0.34, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0
  });
  s.addText(
    "POET:  P — Pneumothorax / Pleural effusion / Pleural thickening\n" +
    "       O — Obesity / thick chest wall\n" +
    "       E — Emphysema (COPD)\n" +
    "       T — Tumour blocking bronchus (also Tracheobronchial obstruction)",
    { x: 0.5, y: 4.12, w: 9.0, h: 1.0, fontSize: 11.5, color: C.text, fontFace: "Calibri", valign: "top" }
  );
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 9 – ADDED SOUNDS: CREPITATIONS
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Auscultation — Added Sounds: Crepitations (Crackles / Rales)");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  s.addText("Non-continuous, interrupted, explosive sounds. Mechanism: sudden opening of collapsed small airways / alveoli OR movement of secretions.", {
    x: 0.35, y: 0.95, w: 9.3, h: 0.38, fontSize: 11.5, color: C.subtext, fontFace: "Calibri", italic: true
  });

  const creps = [
    {
      type: "Fine Crepitations",
      char: "Soft, high-pitched, short\n'Rubbing hair near ear' / Velcro-like",
      timing: "Late inspiratory",
      clears: "Do NOT clear with cough",
      causes: "Pulmonary fibrosis (IPF), early pulmonary oedema, atelectasis",
      color: C.sky
    },
    {
      type: "Medium Crepitations",
      char: "Medium pitch, medium duration",
      timing: "Mid-inspiratory",
      clears: "May partially clear with cough",
      causes: "Bronchiectasis, resolving pneumonia, pulmonary oedema",
      color: C.teal
    },
    {
      type: "Coarse Crepitations",
      char: "Loud, low-pitched, bubbling\n'Fluid in airway' quality",
      timing: "Early inspiratory or expiratory",
      clears: "Clear or change with coughing",
      causes: "Severe pulmonary oedema, bronchiectasis, bronchitis with secretions, lung abscess",
      color: "2C5F7E"
    }
  ];

  creps.forEach(({ type, char, timing, clears, causes, color }, i) => {
    const y = 1.42 + i * 1.27;
    s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 9.3, h: 1.18, fill: { color: i % 2 === 0 ? C.pale : C.white }, line: { type: "none" } });
    s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 0.18, h: 1.18, fill: { color }, line: { type: "none" } });
    s.addText(type, { x: 0.62, y: y + 0.06, w: 2.3, h: 0.3, fontSize: 12.5, bold: true, color, fontFace: "Calibri", margin: 0 });
    s.addText(char, { x: 0.62, y: y + 0.36, w: 2.3, h: 0.7, fontSize: 10.5, color: C.text, fontFace: "Calibri", wrap: true });
    s.addText("Timing: " + timing, { x: 3.1, y: y + 0.1, w: 2.1, h: 0.28, fontSize: 11, color: C.subtext, fontFace: "Calibri", margin: 0 });
    s.addText(clears, { x: 3.1, y: y + 0.42, w: 2.1, h: 0.56, fontSize: 11, color: "B03A2E", fontFace: "Calibri", bold: true, wrap: true });
    s.addText("Causes: " + causes, { x: 5.35, y: y + 0.1, w: 4.15, h: 1.0, fontSize: 11, color: C.text, fontFace: "Calibri", wrap: true });
  });

  // Tip
  s.addText("TIP: Fine late-inspiratory crackles that don't clear with coughing = alveolar/interstitial pathology.  Coarse early crackles that clear = secretions in large airways.", {
    x: 0.35, y: 5.08, w: 9.3, h: 0.28, fontSize: 9.5, color: C.teal, fontFace: "Calibri", italic: true
  });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 10 – RHONCHI, STRIDOR, PLEURAL RUB
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Auscultation — Added Sounds: Rhonchi, Stridor & Pleural Rub");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  // Rhonchi
  card(s, 0.35, 1.0, 9.3, 1.65, C.white, C.sky);
  s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 9.3, h: 0.36, fill: { color: C.sky }, line: { type: "none" } });
  s.addText("Rhonchi (Wheezes) — Continuous Musical Sounds (>250 ms)", {
    x: 0.45, y: 1.0, w: 9.1, h: 0.36, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0
  });
  // Two sub-boxes
  s.addText([
    { text: "Sibilant Rhonchi (High-Pitched Wheeze)\n", options: { bold: true, fontSize: 12, color: C.sky, breakLine: false } },
    { text: "  •  High-pitched, hissing/squeaking, 'squeaky door'\n", options: { fontSize: 11, color: C.text, breakLine: false } },
    { text: "  •  Mainly expiratory; prolonged expiration\n", options: { fontSize: 11, color: C.text, breakLine: false } },
    { text: "  •  Polyphonic (multiple pitches) = diffuse airways disease (asthma)\n", options: { fontSize: 11, color: C.text, breakLine: false } },
    { text: "  •  Monophonic (single pitch) = localised obstruction (tumour, FB)", options: { fontSize: 11, color: C.text } },
  ], { x: 0.45, y: 1.4, w: 4.2, h: 1.2, valign: "top", wrap: true });

  s.addShape(pres.shapes.RECTANGLE, { x: 4.85, y: 1.04, w: 0.02, h: 1.55, fill: { color: C.pale }, line: { type: "none" } });
  s.addText([
    { text: "Sonorous Rhonchi (Low-Pitched Wheeze / Rhonchus)\n", options: { bold: true, fontSize: 12, color: C.teal, breakLine: false } },
    { text: "  •  Low-pitched, snoring/moaning quality\n", options: { fontSize: 11, color: C.text, breakLine: false } },
    { text: "  •  Inspiratory or expiratory\n", options: { fontSize: 11, color: C.text, breakLine: false } },
    { text: "  •  Caused by secretions in large airways\n", options: { fontSize: 11, color: C.text, breakLine: false } },
    { text: "  •  Causes: COPD, chronic bronchitis, mucus plugging", options: { fontSize: 11, color: C.text } },
  ], { x: 4.95, y: 1.4, w: 4.55, h: 1.2, valign: "top", wrap: true });

  // Stridor
  card(s, 0.35, 2.78, 4.55, 1.55, C.white, "B03A2E");
  s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 2.78, w: 4.55, h: 0.36, fill: { color: "B03A2E" }, line: { type: "none" } });
  s.addText("Stridor — URGENT !", {
    x: 0.45, y: 2.78, w: 4.35, h: 0.36, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0
  });
  bulletBox(s, [
    "Loud, harsh, high-pitched, mainly INSPIRATORY",
    "Upper airway obstruction (extrathoracic)",
    "Best heard over trachea / neck",
    "Causes: epiglottitis, croup, foreign body, laryngeal oedema, tracheal tumour, anaphylaxis",
    "URGENT — assess airway immediately",
  ], 0.45, 3.18, 4.35, 1.1, { fontSize: 11 });

  // Pleural rub
  card(s, 5.05, 2.78, 4.6, 1.55, C.white, C.teal);
  s.addShape(pres.shapes.RECTANGLE, { x: 5.05, y: 2.78, w: 4.6, h: 0.36, fill: { color: C.teal }, line: { type: "none" } });
  s.addText("Pleural Friction Rub", {
    x: 5.15, y: 2.78, w: 4.4, h: 0.36, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0
  });
  bulletBox(s, [
    "Creaking, leathery, 'walking on snow' / rubbing leather",
    "Both inspiratory AND expiratory",
    "Disappears when breath is held (vs pericardial rub)",
    "Best heard: lower lateral chest",
    "Causes: pleurisy (infection, PE, malignancy, TB)",
  ], 5.15, 3.18, 4.4, 1.1, { fontSize: 11 });

  // Causes of wheeze mnemonic
  s.addText("Causes of Wheeze: ABCDE — Asthma, Bronchitis (COPD), Cardiac (LVF / cardiac asthma), D = Foreign body, E = Endobronchial tumour / extrinsic compression", {
    x: 0.35, y: 4.42, w: 9.3, h: 0.42, fontSize: 10.5, color: C.subtext, fontFace: "Calibri", italic: true
  });

  footerLine(s, "Physical Examination Skills – Respiratory Assessment");
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 11 – VOCAL RESONANCE
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Step 6 — Vocal Resonance (Voice Sounds)");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  s.addText("The patient phonates while you auscultate — changes in transmitted voice sounds give diagnostic clues.", {
    x: 0.35, y: 0.95, w: 9.3, h: 0.35, fontSize: 11.5, color: C.subtext, fontFace: "Calibri", italic: true
  });

  const vrData = [
    ["Sign", "Instruction to Patient", "Normal Finding", "Abnormal Finding", "Interpretation"],
    ["Vocal Resonance", "Say 'ninety-nine' repeatedly", "Muffled, indistinct words", "Clear/loud (increased) words", "Increased: consolidation\nDecreased: effusion, pneumothorax"],
    ["Bronchophony", "Say 'ninety-nine' loudly", "Words muffled, indistinct", "Loud, clear 'ninety-nine'", "Consolidation (solid lung transmits voice well)"],
    ["Whispering\nPectoriloquy", "Whisper 'one-two-three'", "Barely audible / inaudible", "Clearly heard whispered words", "Consolidation (MOST sensitive sign of consolidation)"],
    ["Aegophony\n(Egophony)", "Say 'E' (eee)", "Hear 'E' — same as said", "Hear 'A' (nasal, bleating quality)", "Compressed lung just above pleural effusion"],
  ];

  const tblX = 0.35;
  const tblY = 1.38;
  const rowH = 0.74;
  const colWs = [1.5, 2.0, 1.6, 1.85, 2.0];
  const colStarts = [0.38, 1.92, 3.96, 5.6, 7.5];

  vrData.forEach((row, i) => {
    const y = tblY + i * rowH;
    const bg = i === 0 ? C.navy : i % 2 === 0 ? C.pale : C.white;
    s.addShape(pres.shapes.RECTANGLE, { x: tblX, y, w: 9.3, h: rowH, fill: { color: bg }, line: { type: "none" } });
    row.forEach((cell, j) => {
      s.addText(cell, {
        x: colStarts[j], y: y + 0.04, w: colWs[j], h: rowH - 0.08,
        fontSize: i === 0 ? 10.5 : 10.5, bold: i === 0,
        color: i === 0 ? C.white : (j === 4 ? C.teal : C.text),
        fontFace: "Calibri", valign: "middle", wrap: true, margin: [2, 3, 2, 3]
      });
    });
  });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 12 – COMMON CONDITIONS SUMMARY TABLE
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Clinical Correlations — Examination Findings at a Glance");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  const data = [
    ["Condition", "Trachea", "Expansion", "Percussion", "Breath Sounds", "Added Sounds", "Vocal Res."],
    ["Consolidation", "Central", "Reduced (ipsi)", "Dull", "Bronchial (tubular)", "Fine/med crepitations", "↑ Bronchophony, WP"],
    ["Pleural Effusion", "Central / away (large)", "Reduced (ipsi)", "Stony dull", "Absent/reduced; bronchial above", "Pleural rub (early)", "Absent; aegophony at top"],
    ["Pneumothorax", "Away (tension)", "Reduced (ipsi)", "Hyper-resonant", "Absent/reduced", "None", "Absent/reduced"],
    ["Emphysema\n(COPD)", "Central", "Reduced (bilat)", "Hyper-resonant", "Vesicular, reduced; prolong. exp.", "Rhonchi ± crepitations", "Reduced"],
    ["Asthma (acute)", "Central", "Reduced (bilat)", "Hyper-resonant", "Vesicular + prolong. exp.", "Polyphonic sibilant rhonchi", "Normal / reduced"],
    ["Fibrosis (IPF)", "Central", "Reduced (bilat)", "Dull", "Vesicular, reduced", "Bilateral fine late insp. creps (Velcro)", "Normal"],
    ["Collapse\n(Atelectasis)", "Towards (ipsi)", "Reduced (ipsi)", "Dull", "Reduced/absent (obstructive)", "None typically", "Reduced"],
    ["Lung Abscess", "Central", "Reduced (ipsi)", "Dull (or tympanitic over cavity)", "Cavernous / amphoric", "Coarse crepitations", "Increased over cavity"],
  ];

  const tblX = 0.25;
  const startY = 0.95;
  const rH = 0.515;
  const colXs =  [0.28, 1.48, 2.36, 3.22, 4.12, 5.62, 7.25];
  const colWs =  [1.15,  0.84, 0.82, 0.86, 1.46, 1.58, 2.45];

  data.forEach((row, i) => {
    const y = startY + i * rH;
    const bg = i === 0 ? C.navy : i % 2 === 0 ? C.pale : C.white;
    s.addShape(pres.shapes.RECTANGLE, { x: tblX, y, w: 9.5, h: rH, fill: { color: bg }, line: { type: "none" } });
    row.forEach((cell, j) => {
      s.addText(cell, {
        x: colXs[j], y: y + 0.02, w: colWs[j], h: rH - 0.04,
        fontSize: i === 0 ? 9.5 : 9,
        bold: i === 0 || j === 0,
        color: i === 0 ? C.white : (j === 0 ? C.navy : C.text),
        fontFace: "Calibri", valign: "middle", wrap: true, margin: [1, 2, 1, 2]
      });
    });
  });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 13 – SPECIAL TESTS & SIGNS
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Special Tests & Eponymous Signs in Respiratory Examination");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  const signs = [
    { name: "Hoover's Sign", color: C.sky, desc: "On deep inspiration, the lower ribs move inwards instead of outwards. Seen in severe COPD (barrel chest, flat diaphragm)." },
    { name: "Pemberton's Sign", color: C.teal, desc: "Arms raised above head for 1 min → facial plethora, cyanosis, JVD = superior mediastinal obstruction (retrosternal goitre, lymphoma)." },
    { name: "Hamman's Sign", color: C.mint, desc: "Mediastinal crunch — crackling sound synchronous with heartbeat (not respiration). Seen in pneumomediastinum." },
    { name: "Bouchut's Sign", color: "8E44AD", desc: "Tubular breathing heard over a consolidated area in a child; helps diagnose early pneumonia when percussion is equivocal." },
    { name: "Skodaic Resonance", color: "B03A2E", desc: "Hyper-resonance heard above a pleural effusion — due to compensatory over-inflation of the lobe above the fluid." },
    { name: "Coin Test (Bell Sound)", color: "B8860B", desc: "One coin held on chest wall, another struck against it; auscultate anteriorly — metallic note = pneumothorax. Now obsolete (replaced by US)." },
  ];

  const cols = 2;
  const rows = 3;
  const cardW = 4.5;
  const cardH = 1.3;
  const startX = 0.35;
  const startY = 1.0;
  const gapX = 0.32;
  const gapY = 0.18;

  signs.forEach(({ name, color, desc }, i) => {
    const col = i % cols;
    const row = Math.floor(i / cols);
    const x = startX + col * (cardW + gapX);
    const y = startY + row * (cardH + gapY);
    card(s, x, y, cardW, cardH, C.white, color);
    s.addShape(pres.shapes.RECTANGLE, { x, y, w: 0.22, h: cardH, fill: { color }, line: { type: "none" } });
    s.addText(name, { x: x + 0.3, y: y + 0.1, w: cardW - 0.4, h: 0.3, fontSize: 12.5, bold: true, color, fontFace: "Calibri", margin: 0 });
    s.addText(desc, { x: x + 0.3, y: y + 0.42, w: cardW - 0.4, h: cardH - 0.48, fontSize: 10.5, color: C.text, fontFace: "Calibri", wrap: true });
  });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 14 – SYSTEMATIC APPROACH / CHECKLIST
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.offWht);
  contentHeader(s, "Systematic Approach — Clinical Examination Checklist");
  footerLine(s, "Physical Examination Skills – Respiratory Assessment");

  // Two column checklist
  const left = [
    ["INTRODUCTION & POSITIONING", [
      "Wash hands, introduce self, consent",
      "Patient sitting at 45° or upright",
      "Adequate exposure (chest exposed)",
    ]],
    ["GENERAL INSPECTION (from end of bed)", [
      "Breathing pattern, accessory muscles, recession",
      "Cyanosis (central vs peripheral)",
      "Nutritional status, build",
      "Sputum pot, O₂, inhalers at bedside",
    ]],
    ["HANDS & ARMS", [
      "Clubbing, cyanosis, flap (asterixis)",
      "Nicotine staining, peripheral oedema",
      "Pulse rate & rhythm (bounding = CO₂ retention)",
    ]],
    ["FACE & NECK", [
      "Eyes: Horner's syndrome (Pancoast tumour)",
      "Mouth: central cyanosis, mucosa",
      "JVP elevation, tracheal position, LN",
    ]],
  ];

  const right = [
    ["CHEST INSPECTION", [
      "Shape (barrel, pigeon, funnel, scoliosis)",
      "Symmetry, scars, dilated veins",
      "Respiratory movements — symmetry, recession",
    ]],
    ["PALPATION", [
      "Tracheal position (central / deviated)",
      "Chest expansion (anterior & posterior)",
      "Tactile vocal fremitus (TVF) bilaterally",
    ]],
    ["PERCUSSION", [
      "Percuss all zones: apex, mid, base — bilateral",
      "Note: resonant / dull / stony dull / hyper-resonant",
    ]],
    ["AUSCULTATION", [
      "Breath sounds: type, intensity",
      "Added sounds: crepitations, rhonchi, rub, stridor",
      "Vocal resonance, bronchophony, WP, aegophony",
    ]],
  ];

  const renderSection = (sections, xBase) => {
    let y = 1.02;
    sections.forEach(([heading, items]) => {
      s.addShape(pres.shapes.RECTANGLE, { x: xBase, y, w: 4.35, h: 0.28, fill: { color: C.teal }, line: { type: "none" } });
      s.addText(heading, { x: xBase + 0.1, y, w: 4.15, h: 0.28, fontSize: 9.5, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
      y += 0.28;
      items.forEach(item => {
        s.addText([{ text: "✓ " + item, options: { bullet: false, fontSize: 10.5, color: C.text, fontFace: "Calibri" } }], {
          x: xBase + 0.12, y, w: 4.2, h: 0.28, valign: "middle", margin: 0
        });
        y += 0.27;
      });
      y += 0.08;
    });
  };

  renderSection(left, 0.3);
  renderSection(right, 5.0);

  // Divider
  s.addShape(pres.shapes.RECTANGLE, { x: 4.88, y: 1.0, w: 0.025, h: 4.2, fill: { color: C.pale }, line: { type: "none" } });
}

// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 15 – KEY TAKEAWAYS / CONCLUSION
// ══════════════════════════════════════════════════════════════════════════════
{
  const s = pres.addSlide();
  addBg(s, C.navy);

  // Decorative elements
  s.addShape(pres.shapes.OVAL, { x: 7.5, y: -1.0, w: 4, h: 4, fill: { color: C.teal, transparency: 65 }, line: { type: "none" } });
  s.addShape(pres.shapes.OVAL, { x: -0.8, y: 3.5, w: 3.5, h: 3.5, fill: { color: C.mint, transparency: 72 }, line: { type: "none" } });
  s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.25, w: 10, h: 0.375, fill: { color: C.mint } });

  s.addText("Key Takeaways", {
    x: 0.6, y: 0.3, w: 8.8, h: 0.55,
    fontSize: 28, bold: true, color: C.gold, fontFace: "Calibri"
  });
  s.addShape(pres.shapes.RECTANGLE, { x: 0.6, y: 0.9, w: 2.5, h: 0.05, fill: { color: C.mint }, line: { type: "none" } });

  const takeaways = [
    "Always follow the sequence: Inspection → Palpation → Percussion → Auscultation",
    "Quantitative changes = intensity of breath sounds (reduced, absent, increased)",
    "Qualitative changes = type of sound (vesicular → bronchial; character of added sounds)",
    "Crepitations that clear with cough = secretions; those that don't = alveolar/interstitial disease",
    "Tracheal deviation: towards lesion (collapse/fibrosis) or away (tension pneumothorax/large effusion)",
    "Stony dullness on percussion is virtually diagnostic of pleural effusion",
    "Whispering pectoriloquy is the most sensitive sign of consolidation",
    "Aegophony (E→A change) indicates compressed lung just above a pleural effusion",
    "Stridor = upper airway emergency — act immediately",
    "Correlate all findings together before reaching a diagnosis — no single sign is pathognomonic",
  ];

  takeaways.forEach((t, i) => {
    const y = 1.08 + i * 0.405;
    s.addShape(pres.shapes.OVAL, { x: 0.55, y: y + 0.07, w: 0.22, h: 0.22, fill: { color: C.mint }, line: { type: "none" } });
    s.addText((i + 1).toString(), { x: 0.55, y: y + 0.07, w: 0.22, h: 0.22, fontSize: 8, bold: true, color: C.navy, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
    s.addText(t, { x: 0.85, y, w: 8.8, h: 0.38, fontSize: 12, color: C.pale, fontFace: "Calibri", valign: "middle" });
  });
}

// ─── WRITE FILE ───────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/resp-exam-pptx/Respiratory_Physical_Examination.pptx" })
  .then(() => console.log("Done: Respiratory_Physical_Examination.pptx"))
  .catch(e => { console.error(e); process.exit(1); });
Running Command

cd /home/daytona/workspace/resp-exam-pptx && node build.js 2>&1

Running Command

ls -lh /home/daytona/workspace/resp-exam-pptx/

Your presentation is ready. Download it here:

Respiratory Physical Examination

Presentation · PPTX


What's inside — 15 slides with a navy/teal/gold color scheme:
SlideContent
1Title slide
2Overview / Table of Contents (8 topics with numbered badges)
3General Inspection — Breathing patterns (Cheyne-Stokes, Kussmaul, Biot's) + Peripheral signs (cyanosis, clubbing, flap)
4Chest Inspection — Static deformities (barrel, pectus, Harrison's sulcus) + Dynamic observations (lagging, recession, accessory muscles)
5Palpation — Tracheal position, chest expansion technique, tactile vocal fremitus (with causes for each change)
6Percussion — Table of all 5 notes (resonant, dull, stony dull, hyper-resonant, tympanitic) with causes and special signs
7Auscultation: technique + normal breath sounds table (vesicular, bronchovesicular, bronchial, tracheal) with I:E ratios + abnormal bronchial breathing
8Quantitative changes in breath sounds (reduced, absent, increased) + POET mnemonic
9Crepitations — Fine, medium, coarse: character, timing, clears with cough, causes
10Rhonchi (sibilant vs sonorous), Stridor (marked urgent), Pleural rub + ABCDE mnemonic for wheeze
11Vocal resonance table — bronchophony, whispering pectoriloquy, aegophony
12Comprehensive comparison table: 8 common conditions across all examination steps
13Eponymous signs — Hoover's, Pemberton's, Hamman's, Skodaic resonance, Coin test
14Systematic examination checklist (clinical OSCE-ready)
1510 Key Takeaways — numbered on dark slide
This is a shared conversation. Sign in to Orris to start your own chat.