- ✅ Herramientas nuevas: * Temporizador de RCP con alertas cada 2 minutos * Calculadora de Duración de Botella de Oxígeno * Calculadora de Goteo (gotas/min y ml/h) * Tabla de perfusión Adrenalina agregada - ✅ Actualización Protocolo RCP: * Orden actualizado: Comprobar consciencia → Llamar 112 → Iniciar RCP * Aplicado a RCP Adulto SVB y Pediátrico - ✅ Cambios UI: * Botones de emergencias críticas con fondo negro y texto blanco * Enlaces de códigos corregidos - ✅ Medicación TES: * Nueva sección separada para medicación autorizada bajo prescripción * Aviso legal prominente * Sin dosis ni decisiones clínicas - ✅ Correcciones: * Errores de sintaxis JSX corregidos (símbolos < y >) * Favicon SVG actualizado * GitHub Pages configurado correctamente
240 lines
6.2 KiB
TypeScript
240 lines
6.2 KiB
TypeScript
/**
|
|
* Fármacos comunes con dosis pediátricas para calculadora
|
|
*/
|
|
|
|
export interface PediatricDrug {
|
|
id: string;
|
|
name: string;
|
|
presentation: string;
|
|
concentration: string; // Ej: "1 mg/ml" o "150 mg/3 ml"
|
|
dosePerKg: string; // Ej: "0.01 mg/kg" o "5 mg/kg"
|
|
maxDose?: string; // Dosis máxima
|
|
minDose?: string; // Dosis mínima
|
|
route: string;
|
|
indication: string;
|
|
notes?: string[];
|
|
warning?: string;
|
|
}
|
|
|
|
export const pediatricDrugs: PediatricDrug[] = [
|
|
{
|
|
id: 'adrenalina-anafilaxia',
|
|
name: 'Adrenalina (Anafilaxia)',
|
|
presentation: 'Ampolla 1 mg/1 ml (1:1000)',
|
|
concentration: '1 mg/ml',
|
|
dosePerKg: '0.01 mg/kg',
|
|
maxDose: '0.5 mg',
|
|
route: 'IM',
|
|
indication: 'Anafilaxia grave',
|
|
notes: [
|
|
'Sitio IM: tercio medio del vasto externo (muslo lateral)',
|
|
'Repetir a los 5 min si no mejora',
|
|
'Efectos adversos esperados (temblor, taquicardia) son normales',
|
|
],
|
|
warning: '⚠️ CONCENTRACIÓN CRÍTICA: Usar ampolla 1:1000 (1 mg/ml) para IM',
|
|
},
|
|
{
|
|
id: 'adrenalina-pcr',
|
|
name: 'Adrenalina (PCR)',
|
|
presentation: 'Ampolla 1 mg/10 ml (1:10.000)',
|
|
concentration: '0.1 mg/ml',
|
|
dosePerKg: '0.01 mg/kg',
|
|
route: 'IV/IO',
|
|
indication: 'Parada cardiorrespiratoria',
|
|
notes: [
|
|
'Administrar durante pausa mínima en compresiones',
|
|
'Lavado con 20 ml SSF',
|
|
'Repetir cada 3-5 minutos',
|
|
],
|
|
warning: '⚠️ CONCENTRACIÓN CRÍTICA: Usar ampolla 1:10.000 (0.1 mg/ml) para IV/IO',
|
|
},
|
|
{
|
|
id: 'amiodarona',
|
|
name: 'Amiodarona',
|
|
presentation: 'Ampolla 150 mg/3 ml',
|
|
concentration: '50 mg/ml',
|
|
dosePerKg: '5 mg/kg',
|
|
maxDose: '300 mg',
|
|
route: 'IV/IO',
|
|
indication: 'FV/TVSP refractaria',
|
|
notes: [
|
|
'Diluir en SG5% (precipita con SSF)',
|
|
'Segunda dosis: 150 mg si persiste FV/TVSP',
|
|
],
|
|
},
|
|
{
|
|
id: 'atropina',
|
|
name: 'Atropina',
|
|
presentation: 'Ampolla 1 mg/1 ml',
|
|
concentration: '1 mg/ml',
|
|
dosePerKg: '0.02 mg/kg',
|
|
minDose: '0.1 mg',
|
|
maxDose: '0.5 mg',
|
|
route: 'IV/IO',
|
|
indication: 'Bradicardia sintomática',
|
|
notes: [
|
|
'Dosis <0.5 mg pueden causar bradicardia paradójica',
|
|
'Repetir cada 3-5 min si es necesario',
|
|
],
|
|
},
|
|
{
|
|
id: 'midazolam-crisis',
|
|
name: 'Midazolam (Crisis)',
|
|
presentation: 'Ampolla 5 mg/1 ml o 10 mg/2 ml',
|
|
concentration: '5 mg/ml',
|
|
dosePerKg: '0.2-0.3 mg/kg',
|
|
maxDose: '10 mg',
|
|
route: 'Intranasal/Bucal',
|
|
indication: 'Crisis convulsiva',
|
|
notes: [
|
|
'Vía intranasal o bucal preferida en pediatría',
|
|
'Monitorizar respiración',
|
|
],
|
|
},
|
|
{
|
|
id: 'salbutamol-nebulizacion',
|
|
name: 'Salbutamol (Nebulización)',
|
|
presentation: 'Ampolla 2.5 mg/2.5 ml',
|
|
concentration: '1 mg/ml',
|
|
dosePerKg: '0.15 mg/kg',
|
|
route: 'Nebulizado',
|
|
indication: 'Crisis asmática / Broncoespasmo',
|
|
notes: [
|
|
'<20 kg: 2.5 mg',
|
|
'≥20 kg: 5 mg',
|
|
'Repetir cada 20 min si es necesario',
|
|
],
|
|
},
|
|
{
|
|
id: 'furosemida',
|
|
name: 'Furosemida',
|
|
presentation: 'Ampolla 20 mg/2 ml',
|
|
concentration: '10 mg/ml',
|
|
dosePerKg: '1-2 mg/kg',
|
|
maxDose: '40 mg',
|
|
route: 'IV/IO',
|
|
indication: 'Edema pulmonar / Insuficiencia cardíaca',
|
|
notes: [
|
|
'Administrar lentamente',
|
|
'Monitorizar diuresis',
|
|
],
|
|
},
|
|
{
|
|
id: 'morfina',
|
|
name: 'Morfina',
|
|
presentation: 'Ampolla 10 mg/1 ml',
|
|
concentration: '10 mg/ml',
|
|
dosePerKg: '0.1-0.2 mg/kg',
|
|
maxDose: '10 mg',
|
|
route: 'IV/IO',
|
|
indication: 'Dolor severo',
|
|
notes: [
|
|
'Administrar lentamente',
|
|
'Monitorizar respiración',
|
|
'Tener naloxona disponible',
|
|
],
|
|
warning: '⚠️ Monitorizar respiración. Tener naloxona disponible',
|
|
},
|
|
{
|
|
id: 'naloxona',
|
|
name: 'Naloxona',
|
|
presentation: 'Ampolla 0.4 mg/1 ml',
|
|
concentration: '0.4 mg/ml',
|
|
dosePerKg: '0.01-0.1 mg/kg',
|
|
route: 'IV/IO/IM',
|
|
indication: 'Intoxicación opioides / Depresión respiratoria',
|
|
notes: [
|
|
'Dosis inicial: 0.01 mg/kg',
|
|
'Repetir si es necesario',
|
|
'Efecto corto, puede requerir múltiples dosis',
|
|
],
|
|
},
|
|
{
|
|
id: 'glucosa',
|
|
name: 'Glucosa (Dextrosa)',
|
|
presentation: 'Ampolla 50% 25 g/50 ml',
|
|
concentration: '0.5 g/ml',
|
|
dosePerKg: '0.5-1 g/kg',
|
|
route: 'IV/IO',
|
|
indication: 'Hipoglucemia',
|
|
notes: [
|
|
'Diluir al 10% o 25% según protocolo',
|
|
'Administrar lentamente',
|
|
'Monitorizar glucemia',
|
|
],
|
|
},
|
|
];
|
|
|
|
/**
|
|
* Calcula la dosis pediátrica de un fármaco
|
|
*/
|
|
export const calculatePediatricDose = (
|
|
drug: PediatricDrug,
|
|
weightKg: number
|
|
): {
|
|
doseMg: number;
|
|
doseMl: number;
|
|
isValid: boolean;
|
|
warning?: string;
|
|
message?: string;
|
|
} => {
|
|
// Extraer dosis por kg del string (ej: "0.01 mg/kg" -> 0.01)
|
|
const doseMatch = drug.dosePerKg.match(/([\d.]+)\s*mg\/kg/);
|
|
if (!doseMatch) {
|
|
return {
|
|
doseMg: 0,
|
|
doseMl: 0,
|
|
isValid: false,
|
|
message: 'Error al parsear dosis por kg',
|
|
};
|
|
}
|
|
|
|
const dosePerKg = parseFloat(doseMatch[1]);
|
|
let doseMg = weightKg * dosePerKg;
|
|
|
|
// Aplicar dosis mínima si existe
|
|
if (drug.minDose) {
|
|
const minMatch = drug.minDose.match(/([\d.]+)\s*mg/);
|
|
if (minMatch) {
|
|
const minDose = parseFloat(minMatch[1]);
|
|
if (doseMg < minDose) {
|
|
doseMg = minDose;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Aplicar dosis máxima si existe
|
|
let warning: string | undefined;
|
|
if (drug.maxDose) {
|
|
const maxMatch = drug.maxDose.match(/([\d.]+)\s*mg/);
|
|
if (maxMatch) {
|
|
const maxDose = parseFloat(maxMatch[1]);
|
|
if (doseMg > maxDose) {
|
|
warning = `⚠️ Dosis calculada (${doseMg.toFixed(2)} mg) excede el máximo (${maxDose} mg). Usar dosis máxima: ${maxDose} mg`;
|
|
doseMg = maxDose;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Calcular ml según concentración
|
|
const concMatch = drug.concentration.match(/([\d.]+)\s*mg\/ml/);
|
|
if (!concMatch) {
|
|
return {
|
|
doseMg,
|
|
doseMl: 0,
|
|
isValid: false,
|
|
message: 'Error al parsear concentración',
|
|
};
|
|
}
|
|
|
|
const concentration = parseFloat(concMatch[1]);
|
|
const doseMl = doseMg / concentration;
|
|
|
|
return {
|
|
doseMg: Math.round(doseMg * 100) / 100, // Redondear a 2 decimales
|
|
doseMl: Math.round(doseMl * 1000) / 1000, // Redondear a 3 decimales
|
|
isValid: true,
|
|
warning,
|
|
};
|
|
};
|