feat(wellvisit): add Expected Reflexes section to By Visit Age

Adds an age-appropriate reflex reference after the Expected Growth /
Feeding block for each well-visit age. Each entry shows the reflex
name, an expected-status chip (Present / Fading / Integrated /
Up-going / Down-going), and a short clinical note covering how to
elicit it, when it should fade, and what abnormal persistence means.

Covers primitive reflexes for newborn-6mo (rooting, sucking, Moro,
palmar/plantar grasp, tonic neck, stepping, Galant, tongue thrust,
Babinski), the transition at 6-18mo (protective extension, parachute,
plantar-response switch), and adult-pattern DTRs/frontal-release
screening from age 2 through 21.
This commit is contained in:
Daniel 2026-04-21 22:20:07 +02:00
parent f39f906fa5
commit 07d7b42efc
2 changed files with 218 additions and 0 deletions

View file

@ -1916,6 +1916,165 @@ const GROWTH_REFERENCE = {
}
};
// ─── REFLEXES (AAP Bright Futures / Nelson Textbook of Pediatrics) ──────────
// Primitive reflexes are brainstem-mediated. Their presence at the expected
// age confirms intact CNS function; their timely disappearance reflects
// normal cortical maturation. Persistence, asymmetry, or re-emergence is a
// red flag for neurologic evaluation.
const REFLEXES_REFERENCE = {
newborn: {
intro: "All primitive reflexes should be present, symmetric, and easily elicited. Absent or markedly asymmetric responses suggest brachial plexus injury, stroke, hypotonia, or other CNS pathology.",
reflexes: [
{ name: "Rooting", status: "Present", note: "Stroking the cheek turns the head toward the touch and opens the mouth. Aids latch. Fades 34 mo." },
{ name: "Sucking", status: "Present", note: "Anything placed in the mouth triggers rhythmic sucking. Becomes voluntary by ~4 mo." },
{ name: "Moro (startle)", status: "Present", note: "Sudden head drop or loud noise → symmetric arm extension then flexion, often with a cry. Asymmetry = brachial plexus injury / clavicle fracture / hemiparesis. Fades 46 mo." },
{ name: "Palmar grasp", status: "Present", note: "Pressure on the palm closes the fingers. Fades 46 mo; persistence interferes with voluntary reach." },
{ name: "Plantar grasp", status: "Present", note: "Pressure at the ball of the foot curls the toes down. Fades 912 mo." },
{ name: "Stepping", status: "Present", note: "Held upright with feet on a surface → reciprocal stepping movements. Fades by ~2 mo." },
{ name: "Galant", status: "Present", note: "Stroking paravertebrally on one side → trunk curves toward the stroked side. Fades 46 mo." },
{ name: "Tonic neck (fencing)", status: "Emerging", note: "Head turned to one side → arm/leg extend on that side, flex on the opposite. Becomes most prominent at 12 mo, fades by 46 mo. An obligate, fixed response is abnormal." },
{ name: "Tongue protrusion (tongue thrust)", status: "Present", note: "Touch to the lips/tongue or a solid in the mouth causes the tongue to push forward. Protects from choking before swallowing is mature; its disappearance at 46 mo is the key signal that purees can begin. Persistence in older kids causes dental open bite, lisps, and messy eating." },
{ name: "Babinski", status: "Up-going (normal)", note: "Stroking the lateral sole → big toe dorsiflexes, toes fan. Normal up to ~1224 mo. A positive Babinski after age 2 is an upper-motor-neuron sign." }
]
},
"1mo": {
intro: "All primitive reflexes remain fully present and symmetric.",
reflexes: [
{ name: "Rooting / Sucking", status: "Present", note: "Strong and reliable; feeding should be well-coordinated." },
{ name: "Moro", status: "Present", note: "Full symmetric response. Asymmetry still warrants eval (brachial plexus, clavicle fracture, hemiparesis)." },
{ name: "Palmar / Plantar grasp", status: "Present", note: "Strong; the baby may lift slightly off the surface when pulling up on your fingers." },
{ name: "Tonic neck", status: "Present", note: "Becoming more visible; should not be obligate." },
{ name: "Galant, Stepping", status: "Present", note: "Still easily elicited." },
{ name: "Tongue thrust", status: "Present", note: "Still fully present — do not start solids." },
{ name: "Babinski", status: "Up-going (normal)", note: "Normal at this age." }
]
},
"2mo": {
intro: "Primitive reflexes still strong; social smile and visual tracking emerging alongside.",
reflexes: [
{ name: "Moro", status: "Present", note: "Still easily triggered. Should peak around this age then begin to wane." },
{ name: "Tonic neck", status: "Peak", note: "Most visible at 12 mo. Should not be obligate or prolonged." },
{ name: "Rooting / Sucking / Palmar / Plantar", status: "Present", note: "All remain strong." },
{ name: "Stepping", status: "Fading", note: "Typically gone by 2 mo." },
{ name: "Tongue thrust", status: "Present", note: "Solids still contraindicated." },
{ name: "Babinski", status: "Up-going (normal)", note: "Normal at this age." }
]
},
"4mo": {
intro: "Transition visit — primitive reflexes are beginning to integrate as cortical control takes over. Readiness for solids depends partly on loss of the tongue-thrust reflex.",
reflexes: [
{ name: "Moro", status: "Fading", note: "Noticeably weaker than at 2 mo. Persistence past 6 mo is abnormal." },
{ name: "Rooting", status: "Fading", note: "Becoming voluntary." },
{ name: "Palmar grasp", status: "Fading", note: "Weaker; voluntary release begins." },
{ name: "Tonic neck", status: "Fading", note: "Should be diminishing; obligate response is abnormal." },
{ name: "Galant, Stepping", status: "Absent", note: "Should be gone by now." },
{ name: "Tongue thrust", status: "Fading / Gone", note: "Disappearance (46 mo) is the readiness sign for pureed solids. If a spoon still gets pushed out, wait." },
{ name: "Landau", status: "Emerging", note: "Held prone in the air, baby extends head, spine, and legs. Integrates by 12 y." },
{ name: "Babinski", status: "Up-going (normal)", note: "Normal at this age." }
]
},
"6mo": {
intro: "Most primitive reflexes should now be integrated. Protective (parachute) reflexes begin emerging — these persist for life.",
reflexes: [
{ name: "Moro, Rooting, Tonic neck, Galant", status: "Absent / Integrated", note: "Persistence at 6 mo warrants neurologic evaluation." },
{ name: "Tongue thrust", status: "Absent", note: "Should be gone — prerequisite for safe spoon-feeding of solids." },
{ name: "Palmar grasp", status: "Integrated", note: "Replaced by voluntary raking grasp." },
{ name: "Plantar grasp", status: "Present", note: "Still present; fades 912 mo." },
{ name: "Parachute", status: "Emerging (69 mo)", note: "Held prone and tilted head-down, arms extend protectively. Persists for life — absence is concerning." },
{ name: "Landau", status: "Present", note: "Full response by ~6 mo." },
{ name: "Babinski", status: "Up-going (normal)", note: "Normal at this age." }
]
},
"9mo": {
intro: "Primitive reflexes should be absent. Protective reflexes present and reliable.",
reflexes: [
{ name: "All primitive reflexes (Moro, grasp, rooting, tonic neck, Galant)", status: "Absent", note: "Persistence is a red flag for CP, hypoxic injury, or genetic/metabolic disease." },
{ name: "Plantar grasp", status: "Fading", note: "Usually gone by 912 mo — allows independent standing." },
{ name: "Parachute", status: "Present", note: "Should be fully present and symmetric." },
{ name: "Protective extension (sideways)", status: "Present", note: "Arm extends to catch self when tipped — needed for safe sitting." },
{ name: "Babinski", status: "Up-going (may still be normal)", note: "Still acceptable; expect resolution by ~2 y." }
]
},
"12mo": {
intro: "Protective and postural reflexes drive standing and cruising. Any lingering primitive reflex is abnormal.",
reflexes: [
{ name: "Primitive reflexes", status: "Absent", note: "Residual Moro, grasp, or tonic neck at 1 y warrants neurologic eval." },
{ name: "Plantar grasp", status: "Absent", note: "Should be gone — needed for weight-bearing and first steps." },
{ name: "Parachute", status: "Present (lifelong)", note: "Symmetric protective arm extension." },
{ name: "Protective extension (forward/sideways/backward)", status: "Present", note: "All directions present by ~12 mo; essential for safe walking." },
{ name: "Babinski", status: "Up-going still acceptable", note: "Normal until ~2 y. Asymmetry is always abnormal." }
]
},
"15mo": {
intro: "Postural reflexes mature alongside walking.",
reflexes: [
{ name: "Primitive reflexes", status: "Absent", note: "Any re-emergence or persistence warrants evaluation." },
{ name: "Parachute / Protective extension", status: "Present", note: "Symmetric in all directions." },
{ name: "Babinski", status: "Up-going still acceptable", note: "Transitioning toward down-going over the next 612 mo." },
{ name: "Deep tendon reflexes (patellar, biceps, Achilles)", status: "Present (2+)", note: "Become easier to elicit as tone normalizes. Symmetric and brisk but not clonic." }
]
},
"18mo": {
intro: "Near-adult reflex pattern; Babinski response nearing transition.",
reflexes: [
{ name: "Primitive reflexes", status: "Absent", note: "Persistence is abnormal." },
{ name: "Parachute / Protective extension", status: "Present", note: "Fully developed." },
{ name: "Babinski", status: "Transitioning", note: "May still be up-going but should be down-going (normal plantar flexion) by age 2." },
{ name: "Deep tendon reflexes", status: "2+ symmetric", note: "Biceps, patellar, Achilles. Asymmetry suggests cord, root, or peripheral nerve pathology." }
]
},
"24mo": {
intro: "Adult-pattern reflex exam expected from age 2.",
reflexes: [
{ name: "Babinski (plantar response)", status: "Down-going (normal)", note: "After age 2, an up-going toe is an upper-motor-neuron sign (stroke, CP, spinal cord lesion, demyelination)." },
{ name: "Deep tendon reflexes", status: "2+ symmetric", note: "Biceps, triceps, brachioradialis, patellar, Achilles. Hyperreflexia or clonus → UMN lesion; hyporeflexia → LMN / neuropathy / myopathy." },
{ name: "Parachute / Protective extension", status: "Present (lifelong)", note: "Absence would be abnormal." },
{ name: "Primitive reflexes", status: "Absent", note: "Any re-emergence is abnormal." }
]
},
"30mo": {
intro: "Adult-pattern exam.",
reflexes: [
{ name: "Plantar response", status: "Down-going", note: "Up-going Babinski after age 2 is abnormal." },
{ name: "Deep tendon reflexes", status: "2+ symmetric", note: "Biceps, patellar, Achilles. Asymmetry, clonus, or hyperreflexia warrants workup." },
{ name: "Protective / postural reflexes", status: "Present", note: "Intact balance reactions support running, climbing, jumping." }
]
},
"3y_to_5y": {
intro: "Standard adult-pattern neurologic reflex exam.",
reflexes: [
{ name: "Plantar response", status: "Down-going", note: "Positive Babinski is always abnormal at this age." },
{ name: "Deep tendon reflexes", status: "2+ symmetric", note: "Biceps, triceps, brachioradialis, patellar, Achilles. Grade 04; asymmetry is the most clinically meaningful finding." },
{ name: "Gait-related reflexes", status: "Intact", note: "Smooth tandem walk, heel-toe, hopping on one foot by age 45 — integrate cerebellar and corticospinal function." }
]
},
"6y_to_10y": {
intro: "Focused adult-pattern exam — any primitive reflex (snout, grasp, glabellar) re-emerging is a frontal release sign and abnormal.",
reflexes: [
{ name: "Plantar response", status: "Down-going", note: "Up-going = UMN lesion." },
{ name: "Deep tendon reflexes", status: "2+ symmetric", note: "Screen for asymmetry, hyperreflexia (MS, cord lesion), or loss (neuropathy, myopathy — e.g., Duchenne's). Loss of Achilles reflex can be an early sign of Charcot-Marie-Tooth." },
{ name: "Abdominal reflexes", status: "Present", note: "Stroking each quadrant contracts the umbilicus toward it. Loss is an early clue to UMN/cord pathology or scoliosis with cord involvement." },
{ name: "Cremasteric reflex (males)", status: "Present", note: "Stroking medial thigh elevates the ipsilateral testis. Absent in testicular torsion." }
]
},
"11y_to_14y": {
intro: "Adult neurologic exam. Sports-participation exams should include a reflex screen.",
reflexes: [
{ name: "Plantar response", status: "Down-going", note: "Up-going is always abnormal." },
{ name: "Deep tendon reflexes", status: "2+ symmetric", note: "Hyperreflexia/clonus in a teen → think MS, myelopathy, spinal cord tumor, B12 deficiency. Hyporeflexia → Guillain-Barré, neuropathy, hypothyroidism." },
{ name: "Abdominal / cremasteric", status: "Present", note: "Same significance as in younger children." }
]
},
"15y_to_21y": {
intro: "Full adult neurologic exam.",
reflexes: [
{ name: "Plantar response", status: "Down-going", note: "Positive Babinski = UMN lesion (stroke, MS, cord pathology)." },
{ name: "Deep tendon reflexes", status: "2+ symmetric", note: "Include biceps, triceps, brachioradialis, patellar, Achilles. Asymmetry or pathologic spread is the main flag." },
{ name: "Primitive / frontal release signs (grasp, snout, palmomental, glabellar)", status: "Absent", note: "Presence suggests frontal lobe pathology, neurodegenerative disease, or severe TBI — rare but important in post-concussion / substance-use contexts." }
]
}
};
// ─── BMI / WEIGHT CLASSIFICATION (AAP 2023 CPG + CDC Extended BMI) ──────────
// Source: AAP Clinical Practice Guideline for Evaluation and Treatment of
// Children and Adolescents with Obesity (Pediatrics 2023;151(2):e2022060640)
@ -1955,6 +2114,7 @@ if (typeof module !== "undefined" && module.exports) {
DYSLIPIDEMIA_SCHEDULE,
NEWBORN_SCREENING,
GROWTH_REFERENCE,
REFLEXES_REFERENCE,
BMI_CLASSIFICATION,
};
}

View file

@ -229,6 +229,41 @@
return key ? GROWTH_REFERENCE[key] : null;
}
// ─── Map visit ID to REFLEXES_REFERENCE key ───────────────────────────────
function getReflexDataForVisit(visitId) {
if (typeof REFLEXES_REFERENCE === 'undefined') return null;
if (REFLEXES_REFERENCE[visitId]) return REFLEXES_REFERENCE[visitId];
var mapping = {
'newborn': 'newborn', '3-5d': 'newborn',
'1mo': '1mo', '2mo': '2mo', '4mo': '4mo', '6mo': '6mo', '9mo': '9mo',
'12mo': '12mo', '15mo': '15mo', '18mo': '18mo',
'24mo': '24mo', '30mo': '30mo',
'3y': '3y_to_5y', '4y': '3y_to_5y', '5y': '3y_to_5y',
'6y': '6y_to_10y', '7y': '6y_to_10y', '8y': '6y_to_10y', '9y': '6y_to_10y', '10y': '6y_to_10y',
'11y': '11y_to_14y', '12y': '11y_to_14y', '13y': '11y_to_14y', '14y': '11y_to_14y',
'15y': '15y_to_21y', '16y': '15y_to_21y', '17y': '15y_to_21y', '18y': '15y_to_21y',
'19y': '15y_to_21y', '20y': '15y_to_21y', '21y': '15y_to_21y'
};
var key = mapping[visitId];
return key ? REFLEXES_REFERENCE[key] : null;
}
// ─── Color a reflex status chip ───────────────────────────────────────────
function reflexStatusColor(status) {
var s = (status || '').toLowerCase();
if (s.indexOf('absent / integrated') !== -1 || s === 'absent' || s.indexOf('integrated') !== -1) return '#059669'; // green — expected integration
if (s.indexOf('present') !== -1 && s.indexOf('lifelong') !== -1) return '#059669';
if (s.indexOf('present') !== -1) return '#2563eb'; // blue — present and expected
if (s.indexOf('peak') !== -1) return '#2563eb';
if (s.indexOf('emerging') !== -1) return '#7c3aed'; // purple
if (s.indexOf('fading') !== -1) return '#d97706'; // amber — in transition
if (s.indexOf('transition') !== -1) return '#d97706';
if (s.indexOf('down-going') !== -1) return '#059669';
if (s.indexOf('up-going') !== -1) return '#d97706';
if (s.indexOf('2+') !== -1) return '#2563eb';
return '#475569';
}
// ─── BY VISIT panel ───────────────────────────────────────────────────────
function renderVisitPanel(visitId) {
var data = (typeof PERIODICITY !== 'undefined') ? PERIODICITY[visitId] : null;
@ -350,6 +385,29 @@
html += '</div>';
}
// ── Expected Reflexes ──
var reflexData = getReflexDataForVisit(visitId);
if (reflexData && reflexData.reflexes && reflexData.reflexes.length) {
html += '<div class="wv-section">';
html += '<h4 class="wv-section-title"><i class="fas fa-hand-sparkles"></i> Expected Reflexes</h4>';
if (reflexData.intro) {
html += '<div style="font-size:12px;color:var(--g600);margin-bottom:8px;line-height:1.5;">' + esc(reflexData.intro) + '</div>';
}
html += '<div class="wv-growth-box">';
reflexData.reflexes.forEach(function (r) {
var color = reflexStatusColor(r.status);
html += '<div class="wv-growth-item" style="flex-direction:column;align-items:stretch;gap:4px;">';
html += '<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">';
html += '<span class="wv-growth-label" style="min-width:0;">' + esc(r.name) + '</span>';
html += '<span style="font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px;background:' + color + '1a;color:' + color + ';border:1px solid ' + color + '66;">' + esc(r.status) + '</span>';
html += '</div>';
html += '<div style="font-size:12px;color:var(--g700);line-height:1.5;">' + esc(r.note) + '</div>';
html += '</div>';
});
html += '</div>';
html += '</div>';
}
// ── BMI / Weight Classification (ages 2+) ──
if (growthData && growthData.bmiClassification && typeof BMI_CLASSIFICATION !== 'undefined') {
html += '<div class="wv-section">';