feat(client): port Sedation + Toxicology Bedside panels
Ten of fifteen Bedside pills now have real React implementations.
Remaining five (neonatal, respiratory, ventilation, sepsis, burns)
stay on LegacyPanel — they each have more complex state (Fenton
LMS, Phoenix criteria, Lund-Browder age-adjusted region tables,
bronchiolitis / asthma severity scoring) best tackled in dedicated
sessions where the clinical data can be verified carefully.
client/src/pages/BedsidePanels.tsx
• SedationPanel — full procedural-sedation drug list (ketamine IV/IM,
midazolam IV/IN/PO, propofol, fentanyl IV/IN, nitrous oxide,
dexmedetomidine IN) plus reversal agents (naloxone, flumazenil).
Dose cells mirror the vanilla sedDoseCell helper: range-low/high
with per-kg footer, or single per-kg + max. Pre-sedation checklist
and citation preserved.
• ToxicologyPanel — topic selector with 11 panels (general approach,
acetaminophen, opioids, iron, TCA, β-blocker/CCB, benzo,
organophosphate, salicylate, toxic alcohols, dialyzable drugs).
Every drug dose and clinical pearl carried over byte-for-byte.
Weight-dependent drugs (NAC weight-based loading, naloxone
range, magnesium for TCA torsades) compute against the entered
weight; topic panels work with or without a weight value.
Client tsc -b + vite build clean.
This commit is contained in:
parent
d663526511
commit
591257a0c7
3 changed files with 366 additions and 2 deletions
|
|
@ -1101,6 +1101,367 @@ export function TraumaPanel() {
|
|||
);
|
||||
}
|
||||
|
||||
// ── Procedural Sedation ─────────────────────────────────────
|
||||
// Drug data ported verbatim from public/js/bedside/sedation.js SED_FALLBACK.
|
||||
interface SedDrug {
|
||||
name: string;
|
||||
display: string | null;
|
||||
route: string;
|
||||
onset?: string;
|
||||
duration?: string;
|
||||
notes: string;
|
||||
perKgLow?: number; perKgHigh?: number; maxLow?: number | null; maxHigh?: number | null;
|
||||
perKg?: number; max?: number | null;
|
||||
unit: 'mg' | 'mcg' | 'mix';
|
||||
doseDisplay?: string;
|
||||
reverses?: string;
|
||||
}
|
||||
const SED_DRUGS: SedDrug[] = [
|
||||
{ name: 'Ketamine IV', display: 'Ketamine', perKgLow: 1.5, perKgHigh: 2, maxLow: 100, maxHigh: 150, unit: 'mg', route: 'IV', onset: '1 min', duration: '15-30 min', notes: 'Dissociative. Preserves airway reflexes.' },
|
||||
{ name: 'Ketamine IM', display: null, perKgLow: 4, perKgHigh: 5, maxLow: 300, maxHigh: 400, unit: 'mg', route: 'IM', onset: '3-5 min', duration: '30-60 min', notes: 'Give atropine 0.01 mg/kg to reduce secretions.' },
|
||||
{ name: 'Midazolam IV', display: 'Midazolam', perKgLow: 0.05, perKgHigh: 0.1, maxLow: 2, maxHigh: 5, unit: 'mg', route: 'IV', onset: '2-3 min', duration: '30-60 min', notes: 'Anxiolysis. Titrate q3-5 min.' },
|
||||
{ name: 'Midazolam IN/PO', display: null, perKg: 0.5, max: 20, unit: 'mg', route: 'IN/PO', onset: '10-15 min', duration: '30-60 min', notes: 'IN (max 10 mg / naris) or PO (max 20 mg).' },
|
||||
{ name: 'Propofol', display: 'Propofol', perKg: 1, max: 40, unit: 'mg', route: 'IV', onset: '30 sec', duration: '5-10 min', notes: 'Short procedures. Causes apnea — manage airway.' },
|
||||
{ name: 'Fentanyl IV', display: 'Fentanyl', perKg: 1, max: 100, unit: 'mcg', route: 'IV', onset: '2-3 min', duration: '30-60 min', notes: 'Analgesic. Often combined with midazolam.' },
|
||||
{ name: 'Fentanyl IN', display: null, perKg: 2, max: 100, unit: 'mcg', route: 'IN', onset: '5-10 min', duration: '30-60 min', notes: 'Intranasal.' },
|
||||
{ name: 'Nitrous oxide', display: 'Nitrous oxide', doseDisplay: '50:50 or 70:30 mix', unit: 'mix', route: 'Inhaled', onset: '2-5 min', duration: '5 min off', notes: 'Self-administered via demand valve. Anxiolysis + mild analgesia.' },
|
||||
{ name: 'Dexmedetomidine IN', display: 'Dexmedetomidine', perKgLow: 2, perKgHigh: 3, maxLow: 100, maxHigh: null, unit: 'mcg', route: 'IN', onset: '15-30 min', duration: '60-90 min', notes: 'Intranasal. No respiratory depression. Good for imaging.' },
|
||||
{ name: 'Naloxone', display: 'Naloxone', perKg: 0.1, max: 2, unit: 'mg', route: 'IV/IM/IN', reverses: 'Opioids (fentanyl, morphine)', notes: 'Max 2 mg. Repeat q2-3 min. Duration shorter than opioids — monitor for re-sedation.' },
|
||||
{ name: 'Flumazenil', display: 'Flumazenil', perKg: 0.01, max: 0.2, unit: 'mg', route: 'IV', reverses: 'Benzodiazepines (midazolam)', notes: 'Max 0.2 mg single dose. Repeat q1 min to max 1 mg total. Risk of seizures — use cautiously.' },
|
||||
];
|
||||
|
||||
function sedDoseCell(wt: number, dg: SedDrug): string {
|
||||
if (dg.doseDisplay) return dg.doseDisplay;
|
||||
const unitLabel = dg.unit === 'mcg' ? ' mcg' : dg.unit === 'mix' ? '' : ' mg';
|
||||
const perKgUnit = dg.unit === 'mcg' ? 'mcg' : 'mg';
|
||||
if (dg.perKgLow != null) {
|
||||
const lo = formatDose(wt, dg.perKgLow, dg.maxLow ?? null).value;
|
||||
if (dg.perKgHigh != null) {
|
||||
const hi = formatDose(wt, dg.perKgHigh, dg.maxHigh ?? null).value;
|
||||
return `${lo}-${hi}${unitLabel} (${dg.perKgLow}-${dg.perKgHigh} ${perKgUnit}/kg)`;
|
||||
}
|
||||
return `${lo}${unitLabel} (${dg.perKgLow} ${perKgUnit}/kg)`;
|
||||
}
|
||||
if (dg.perKg != null) {
|
||||
const v = formatDose(wt, dg.perKg, dg.max ?? null).value;
|
||||
return `${v}${unitLabel} (${dg.perKg} ${perKgUnit}/kg)`;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
export function SedationPanel() {
|
||||
const [weight, setWeight] = useState('');
|
||||
const wt = Number.parseFloat(weight);
|
||||
const valid = Number.isFinite(wt) && wt > 0;
|
||||
const agents = SED_DRUGS.filter((d) => !d.reverses);
|
||||
const reversals = SED_DRUGS.filter((d) => d.reverses);
|
||||
|
||||
function AgentRow({ dg }: { dg: SedDrug }) {
|
||||
return (
|
||||
<tr>
|
||||
<td className={td + ' font-semibold'}>{dg.display ?? ''}</td>
|
||||
<td className={td}><Dose label={sedDoseCell(wt, dg)} /></td>
|
||||
<td className={td + ' text-xs'}>{dg.route}</td>
|
||||
<td className={td + ' text-xs'}>{dg.onset ?? ''}</td>
|
||||
<td className={td + ' text-xs'}>{dg.duration ?? ''}</td>
|
||||
<td className={td + ' text-xs text-muted-foreground'}>{dg.notes}</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
function RevRow({ dg }: { dg: SedDrug }) {
|
||||
return (
|
||||
<tr>
|
||||
<td className={td + ' font-semibold'}>{dg.display}</td>
|
||||
<td className={td}><Dose label={sedDoseCell(wt, dg)} /></td>
|
||||
<td className={td + ' text-xs'}>{dg.route}</td>
|
||||
<td className={td + ' text-xs'}>{dg.reverses}</td>
|
||||
<td className={td + ' text-xs text-muted-foreground'}>{dg.notes}</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<section className={card} data-testid="bedside-panel-sedation">
|
||||
<h2 className="text-lg font-semibold">Procedural Sedation</h2>
|
||||
<WeightField id="sed-wt" value={weight} onChange={setWeight} testid="sed-weight" />
|
||||
{!valid ? (
|
||||
<p className="text-xs text-destructive">Enter weight (kg) to see doses.</p>
|
||||
) : (
|
||||
<>
|
||||
<div className="rounded-md border-2 border-purple-500 bg-purple-50 dark:bg-purple-950/30 p-3 text-sm font-semibold text-purple-900 dark:text-purple-100">
|
||||
Procedural Sedation — {wt} kg patient
|
||||
</div>
|
||||
<h3 className="text-sm font-semibold">Sedation Agents</h3>
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full text-sm">
|
||||
<thead>
|
||||
<tr><th className={th}>Drug</th><th className={th}>Dose</th><th className={th}>Route</th><th className={th}>Onset</th><th className={th}>Duration</th><th className={th}>Notes</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{agents.map((d) => <AgentRow key={d.name} dg={d} />)}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<h3 className="text-sm font-semibold text-destructive">Reversal Agents</h3>
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full text-sm">
|
||||
<thead className="bg-red-50 dark:bg-red-950/30">
|
||||
<tr><th className={th}>Drug</th><th className={th}>Dose</th><th className={th}>Route</th><th className={th}>Reverses</th><th className={th}>Notes</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{reversals.map((d) => <RevRow key={d.name} dg={d} />)}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div className="rounded-md bg-amber-50 dark:bg-amber-950/30 p-3 text-xs text-amber-900 dark:text-amber-100">
|
||||
<strong>Pre-sedation checklist:</strong> NPO status (2h clear liquids, 6h solids), consent, monitoring equipment (pulse ox, capnography, BP), resuscitation equipment at bedside, suction ready, IV access. Minimum monitoring: continuous SpO₂, HR, capnography. Provider capable of managing airway must be present.
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground italic">
|
||||
AAP Guidelines for Monitoring and Management of Pediatric Patients Before, During, and After Sedation · ASA Practice Guidelines for Sedation and Analgesia by Non-Anesthesiologists.
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
// ── Toxicology ──────────────────────────────────────────────
|
||||
// Topic content ported verbatim from public/js/bedside/toxicology.js.
|
||||
const TOX_TOPICS: Array<[string, string]> = [
|
||||
['approach', 'General approach (stabilize → toxidrome → decon → antidote)'],
|
||||
['acetaminophen', 'Acetaminophen overdose'],
|
||||
['opioids', 'Opioid overdose'],
|
||||
['iron', 'Iron overdose'],
|
||||
['tca', 'Tricyclic antidepressant (TCA) overdose'],
|
||||
['bbccb', 'β-blocker / CCB overdose'],
|
||||
['benzo', 'Benzodiazepine overdose'],
|
||||
['organo', 'Organophosphate / carbamate poisoning'],
|
||||
['salicylate', 'Salicylate overdose'],
|
||||
['etoh', 'Toxic alcohols (methanol / ethylene glycol)'],
|
||||
['dialyzable', 'Dialyzable drugs (ISTUMBLE)'],
|
||||
];
|
||||
|
||||
export function ToxicologyPanel() {
|
||||
const [weight, setWeight] = useState('');
|
||||
const [topic, setTopic] = useState('approach');
|
||||
const wt = Number.parseFloat(weight);
|
||||
const valid = Number.isFinite(wt) && wt > 0;
|
||||
const f = (perKg: number, max: number | null, unit = 'mg') => (valid ? formatDose(wt, perKg, max, unit).value : null);
|
||||
|
||||
function Step({ color, title, body }: { color: string; title: string; body: React.ReactNode }) {
|
||||
return (
|
||||
<div className={`rounded-md border-l-4 ${color} p-3 text-sm`}>
|
||||
<div className="font-semibold mb-1">{title}</div>
|
||||
<div className="text-xs text-muted-foreground">{body}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function Row({ drug, dose, route, notes }: { drug: string; dose: React.ReactNode; route: string; notes: string }) {
|
||||
return (
|
||||
<tr>
|
||||
<td className={td + ' font-semibold'}>{drug}</td>
|
||||
<td className={td}>{dose}</td>
|
||||
<td className={td + ' text-xs'}>{route}</td>
|
||||
<td className={td + ' text-xs text-muted-foreground'} dangerouslySetInnerHTML={{ __html: notes }} />
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
|
||||
function Table({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full text-sm">
|
||||
<thead><tr><th className={th}>Drug</th><th className={th}>Dose</th><th className={th}>Route</th><th className={th}>Notes</th></tr></thead>
|
||||
<tbody>{children}</tbody>
|
||||
</table>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<section className={card} data-testid="bedside-panel-toxicology">
|
||||
<h2 className="text-lg font-semibold">Toxicology</h2>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3 max-w-xl">
|
||||
<WeightField id="tox-wt" value={weight} onChange={setWeight} testid="tox-weight" />
|
||||
<div>
|
||||
<label htmlFor="tox-topic" className={label}>Topic</label>
|
||||
<select id="tox-topic" className={input} value={topic} onChange={(e) => setTopic(e.target.value)} data-testid="tox-topic">
|
||||
{TOX_TOPICS.map(([v, l]) => <option key={v} value={v}>{l}</option>)}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{topic === 'approach' && (
|
||||
<div className="space-y-2">
|
||||
<Step color="border-blue-500 bg-blue-50 dark:bg-blue-950/30" title="1. Stabilize (ABCDE)" body={<>Airway, breathing, circulation, disability (glucose, pupils, GCS), exposure. Naloxone if depressed LOC + resp depression. Dextrose if hypoglycemic. Thiamine in select cases.</>} />
|
||||
<Step color="border-purple-500 bg-purple-50 dark:bg-purple-950/30" title="2. Identify toxidrome" body={<><strong>Sympathomimetic:</strong> HTN, tachy, mydriasis, diaphoresis (cocaine, meth). <strong>Anticholinergic:</strong> hot/dry, mydriasis, tachy, delirium (antihistamines, TCAs). <strong>Cholinergic:</strong> SLUDGE-M, miosis (organophosphates). <strong>Opioid:</strong> miosis, resp depression, ↓LOC. <strong>Sedative-hypnotic:</strong> ↓LOC, normal/low vitals.</>} />
|
||||
<Step color="border-amber-500 bg-amber-50 dark:bg-amber-950/30" title="3. Decontamination" body={<><strong>Activated charcoal</strong> 1 g/kg PO (max 50 g): within 1h of ingestion, intact airway, ingestion adsorbed (not Li, metals, alcohols). Avoid caustics/hydrocarbons. <strong>Whole bowel irrigation:</strong> PEG for metals/iron/lithium/sustained release. <strong>Gastric lavage:</strong> rarely indicated. <strong>Ipecac:</strong> no longer recommended.</>} />
|
||||
<Step color="border-green-500 bg-green-50 dark:bg-green-950/30" title="4. Enhance elimination" body={<><strong>Urinary alkalinization</strong> (salicylates, phenobarbital). <strong>Hemodialysis</strong> (see ISTUMBLE). <strong>Lipid emulsion</strong> for lipid-soluble drug toxicity (LA, CCB, TCA).</>} />
|
||||
<Step color="border-destructive bg-red-50 dark:bg-red-950/30" title="5. Antidotes" body={<>See topic list. <strong>Contact Poison Center</strong> (US: 1-800-222-1222) early for any significant exposure.</>} />
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'acetaminophen' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">Acetaminophen overdose</div>
|
||||
<p className="text-sm">Acute toxic dose: >150 mg/kg (or 7.5 g total) single ingestion. Hepatotoxic after 24h; AST/ALT peak day 3-4.</p>
|
||||
<p className="text-sm"><strong>Diagnosis:</strong> Draw level at 4h post-ingestion (or on arrival if >4h). Plot on <strong>Rumack-Matthew nomogram</strong> (treatment line at 150 mcg/mL at 4h).</p>
|
||||
<Table>
|
||||
<Row drug="N-acetylcysteine (NAC) — IV" dose="150 mg/kg over 1h → 50 mg/kg over 4h → 100 mg/kg over 16h (21h total)" route="IV" notes="Total 300 mg/kg. Most effective if started <8h post-ingestion." />
|
||||
<Row drug="N-acetylcysteine — PO" dose="140 mg/kg load, then 70 mg/kg q4h × 17 doses" route="PO" notes="Alternative to IV. Unpleasant taste — often with juice." />
|
||||
<Row drug="Activated charcoal" dose="1 g/kg (max 50 g)" route="PO" notes="If within 1-2h of ingestion and airway protected." />
|
||||
</Table>
|
||||
{valid && (
|
||||
<div className="rounded-md bg-muted/40 p-3 text-xs">
|
||||
<strong>For {wt} kg:</strong> IV loading = {f(150, null)} mg over 1h <span className="text-muted-foreground">(150 mg/kg)</span>; 2nd bag = {f(50, null)} mg over 4h <span className="text-muted-foreground">(50 mg/kg)</span>; 3rd bag = {f(100, null)} mg over 16h <span className="text-muted-foreground">(100 mg/kg)</span>. <em>Total 300 mg/kg.</em>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'opioids' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">Opioid overdose</div>
|
||||
<p className="text-sm">Triad: <strong>miosis + respiratory depression + ↓ LOC</strong>. Fentanyl / synthetics may require repeated/higher doses.</p>
|
||||
<Table>
|
||||
<Row drug="Naloxone (initial)" dose={valid ? `0.01-0.1 mg/kg = ${f(0.01, null)}-${f(0.1, null)} mg` : '0.01-0.1 mg/kg'} route="IV / IM / IN / IO" notes="Start low if chronic opioid use (avoid withdrawal). Titrate to respiratory effort, not consciousness." />
|
||||
<Row drug="Naloxone (full reversal)" dose="2 mg IV/IM/IN" route="IV / IM / IN" notes="If no chronic use and severe resp depression. Repeat q2-3 min." />
|
||||
<Row drug="Naloxone infusion" dose="2/3 of effective bolus per hour" route="IV" notes="For long-acting opioids (methadone, fentanyl patch, sustained release)" />
|
||||
</Table>
|
||||
<div className="rounded-md bg-amber-50 dark:bg-amber-950/30 p-3 text-xs text-amber-900 dark:text-amber-100">
|
||||
Observe ≥4h after last dose; longer for long-acting agents. Duration of naloxone (30-90 min) is shorter than most opioids — <strong>re-sedation is common</strong>.
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'iron' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">Iron overdose</div>
|
||||
<p className="text-sm">Toxic dose: elemental Fe ≥20 mg/kg. Severe ≥60 mg/kg. <strong>Charcoal does NOT bind iron.</strong></p>
|
||||
<p className="text-sm"><strong>Stages:</strong> 1) GI (0-6h: vomiting, bloody diarrhea); 2) Latent (6-24h); 3) Shock/metabolic acidosis (12-24h); 4) Hepatotoxicity (2-5d); 5) Gastric scarring (2-8 wk).</p>
|
||||
<Table>
|
||||
<Row drug="Whole bowel irrigation" dose="PEG-ES 25-40 mL/kg/hr" route="NG" notes="For radiopaque pills on KUB or ingested sustained-release iron." />
|
||||
<Row drug="Deferoxamine" dose="15 mg/kg/hr IV infusion" route="IV" notes="Max 6-8 g/day. Indications: shock, metabolic acidosis, Fe >500 mcg/dL, or severe symptoms. Urine turns 'vin rosé' color." />
|
||||
</Table>
|
||||
<div className="rounded-md bg-amber-50 dark:bg-amber-950/30 p-3 text-xs text-amber-900 dark:text-amber-100">
|
||||
Iron level at 4-6h. <350 usually asymptomatic; 350-500 mild; >500 severe. Consider KUB for radiopaque pills.
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'tca' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">TCA overdose</div>
|
||||
<p className="text-sm">Anticholinergic + Na-channel blockade. <strong>Risks:</strong> seizure, VT/VF, hypotension, coma. ECG: QRS >100 ms or R in aVR >3 mm predicts toxicity.</p>
|
||||
<Table>
|
||||
<Row drug="Sodium bicarbonate 8.4%" dose="1-2 mEq/kg IV bolus → infusion" route="IV" notes="Goal pH 7.45-7.55 and narrowing QRS. Repeat bolus for QRS widening, hypotension, or arrhythmia." />
|
||||
<Row drug="Mg sulfate" dose={valid ? `${f(50, 2000)} mg` : '25-50 mg/kg (max 2 g)'} route="IV over 10 min" notes="For torsades." />
|
||||
<Row drug="IV lipid emulsion 20%" dose="1.5 mL/kg bolus → 0.25 mL/kg/min × 30-60 min" route="IV" notes="If refractory shock/arrest. Consult toxicology." />
|
||||
</Table>
|
||||
<div className="rounded-md bg-amber-50 dark:bg-amber-950/30 p-3 text-xs text-amber-900 dark:text-amber-100">
|
||||
<strong>Avoid</strong> Class IA/IC antiarrhythmics, beta-blockers, physostigmine (risk of asystole with TCAs).
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'bbccb' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">β-blocker / Calcium-channel blocker overdose</div>
|
||||
<p className="text-sm">Bradycardia + hypotension. CCBs (esp. verapamil, diltiazem, amlodipine) can be lethal in small pediatric doses.</p>
|
||||
<Table>
|
||||
<Row drug="IV fluids" dose="20 mL/kg NS bolus" route="IV" notes="Cautious — avoid volume overload" />
|
||||
<Row drug="Calcium chloride 10% or gluconate" dose="CaCl 20 mg/kg / Ca-glu 60 mg/kg" route="IV" notes="First-line for CCB. Repeat q15-20 min." />
|
||||
<Row drug="Glucagon" dose="50 mcg/kg IV bolus → 50-150 mcg/kg/hr" route="IV" notes="β-blocker antidote. GI side effects common." />
|
||||
<Row drug="High-dose insulin (HIE)" dose="Regular insulin 1 U/kg bolus → 0.5-2 U/kg/hr + D25% infusion" route="IV" notes="Hyperinsulinemic euglycemia therapy. Monitor K+ and glucose closely." />
|
||||
<Row drug="Vasopressors" dose="Epi / norepi infusion" route="IV" notes="Titrate to MAP." />
|
||||
<Row drug="Lipid emulsion 20%" dose="1.5 mL/kg → 0.25 mL/kg/min" route="IV" notes="For lipid-soluble CCBs (verapamil) if refractory." />
|
||||
<Row drug="Methylene blue / ECMO" dose="—" route="—" notes="Rescue therapy — toxicology/ICU consult." />
|
||||
</Table>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'benzo' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">Benzodiazepine overdose</div>
|
||||
<p className="text-sm">Sedation + resp depression. Usually supportive — intubation rarely needed alone. <strong>Flumazenil caution.</strong></p>
|
||||
<Table>
|
||||
<Row drug="Flumazenil" dose="0.01 mg/kg (max 0.2 mg) IV, may repeat q1 min to max 1 mg" route="IV" notes="Only for iatrogenic reversal in a benzo-naive patient with no TCAs, seizure disorder, or chronic benzo use. <strong>Can precipitate seizures.</strong>" />
|
||||
</Table>
|
||||
<div className="rounded-md bg-amber-50 dark:bg-amber-950/30 p-3 text-xs text-amber-900 dark:text-amber-100">
|
||||
In real-world ingestion, <strong>supportive care (airway, monitoring)</strong> is usually safer than flumazenil.
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'organo' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">Organophosphate / carbamate poisoning</div>
|
||||
<p className="text-sm">Cholinergic toxidrome: <strong>SLUDGE-M</strong> (salivation, lacrimation, urination, defecation, GI distress, emesis, miosis) + muscle fasciculation, bradycardia, bronchorrhea. Decontamination critical (PPE for providers).</p>
|
||||
<Table>
|
||||
<Row drug="Atropine" dose="0.05 mg/kg IV, double q3-5 min until bronchial secretions dry" route="IV" notes="Endpoint = dry lungs, not dry mouth or heart rate. Can require huge doses." />
|
||||
<Row drug="Pralidoxime (2-PAM)" dose="25-50 mg/kg IV over 30 min (max 2 g) → 10-20 mg/kg/hr" route="IV" notes="Only for organophosphates (not carbamates). Regenerates acetylcholinesterase." />
|
||||
<Row drug="Diazepam / midazolam" dose="Standard seizure doses" route="IV" notes="For seizures or severe fasciculations." />
|
||||
</Table>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'salicylate' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">Salicylate overdose</div>
|
||||
<p className="text-sm">Mixed respiratory alkalosis + anion gap metabolic acidosis. Tinnitus, tachypnea, diaphoresis, hyperthermia. Severe: CNS depression, seizures, pulmonary edema, cerebral edema.</p>
|
||||
<Table>
|
||||
<Row drug="Fluids" dose="Aggressive resuscitation" route="IV" notes="Dehydration common. Avoid fluid overload (risk of pulmonary edema)." />
|
||||
<Row drug="Sodium bicarb" dose="1-2 mEq/kg IV bolus → drip" route="IV" notes="Urinary alkalinization (goal urine pH >7.5). Prevents CNS entry." />
|
||||
<Row drug="Glucose" dose="Maintain euglycemia even if BG normal" route="IV" notes="CNS hypoglycemia despite normal serum glucose." />
|
||||
<Row drug="Hemodialysis" dose="—" route="—" notes="For severe: altered MS, pulmonary edema, renal failure, refractory acidosis, or level >100 mg/dL acute / >60 chronic." />
|
||||
</Table>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'etoh' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">Toxic alcohols (methanol / ethylene glycol)</div>
|
||||
<p className="text-sm">Anion gap metabolic acidosis + osmolar gap. Methanol → visual changes, blindness. Ethylene glycol → calcium oxalate crystals in urine, renal failure.</p>
|
||||
<Table>
|
||||
<Row drug="Fomepizole" dose="15 mg/kg IV load → 10 mg/kg q12h × 4 → 15 mg/kg q12h" route="IV" notes="First-line. Inhibits alcohol dehydrogenase." />
|
||||
<Row drug="Ethanol (alternative)" dose="Load 600 mg/kg → maintain level 100-150 mg/dL" route="IV / PO" notes="If fomepizole unavailable. Monitor closely." />
|
||||
<Row drug="Hemodialysis" dose="—" route="—" notes="For severe acidosis, end-organ damage, or high levels." />
|
||||
<Row drug="Folate / thiamine / pyridoxine" dose="Standard doses" route="IV" notes="Methanol: folate. EG: thiamine + pyridoxine (divert to non-toxic metabolites)." />
|
||||
</Table>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{topic === 'dialyzable' && (
|
||||
<div className="space-y-2">
|
||||
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-3 text-sm font-semibold">Dialyzable drugs (ISTUMBLE)</div>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm">
|
||||
{[
|
||||
['I', 'Isopropyl alcohol, INH'],
|
||||
['S', 'Salicylates'],
|
||||
['T', 'Theophylline, Toxic alcohols'],
|
||||
['U', 'Uremia-related drugs'],
|
||||
['M', 'Methanol, Metformin, Methotrexate'],
|
||||
['B', 'Barbiturates (long-acting)'],
|
||||
['L', 'Lithium'],
|
||||
['E', 'Ethylene glycol'],
|
||||
].map(([k, v]) => (
|
||||
<div key={k} className="rounded-md bg-muted/40 p-2"><strong>{k}:</strong> {v}</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="rounded-md bg-amber-50 dark:bg-amber-950/30 p-3 text-xs text-amber-900 dark:text-amber-100">
|
||||
<strong>Poor candidates for HD:</strong> Large Vd (TCAs, digoxin, BBs), highly protein-bound (benzos, CCBs), lipid-soluble (opioids, phenothiazines). EXTRIP recommendations are evidence-based — consult toxicology.
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="text-xs text-muted-foreground italic">
|
||||
Call Poison Control early: 1-800-222-1222 (US) · Refs: Goldfrank's Toxicologic Emergencies · EXTRIP workgroup.
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
// Helper to keep Bedside.tsx concise — dispatch by pill id.
|
||||
export function renderBedsideRealPanel(pillId: string): React.ReactNode | null {
|
||||
switch (pillId) {
|
||||
|
|
@ -1112,6 +1473,8 @@ export function renderBedsideRealPanel(pillId: string): React.ReactNode | null {
|
|||
case 'antiemetics': return <AntiemeticsPanel />;
|
||||
case 'antimicrobials': return <AntimicrobialsPanel />;
|
||||
case 'trauma': return <TraumaPanel />;
|
||||
case 'sedation': return <SedationPanel />;
|
||||
case 'toxicology': return <ToxicologyPanel />;
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -1121,4 +1484,5 @@ export function renderBedsideRealPanel(pillId: string): React.ReactNode | null {
|
|||
export const REAL_BEDSIDE_PANELS: ReadonlySet<string> = new Set([
|
||||
'anaphylaxis', 'cardiac', 'seizure',
|
||||
'airway', 'agitation', 'antiemetics', 'antimicrobials', 'trauma',
|
||||
'sedation', 'toxicology',
|
||||
]);
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -5,7 +5,7 @@
|
|||
<link rel="icon" type="image/svg+xml" href="/app/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>client</title>
|
||||
<script type="module" crossorigin src="/app/assets/index-CU47FuJC.js"></script>
|
||||
<script type="module" crossorigin src="/app/assets/index-TLwX8Fhd.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/app/assets/index-BFoZEwhP.css">
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
Loading…
Reference in a new issue