-
-
Welcome to Your Blank App
-
Start building your amazing project here!
-
+
+ {/* Search Bar */}
+
+
+
+ Buscar protocolo, fármaco, calculadora...
+
+
+
+ {/* Emergency Buttons Grid */}
+
+
+ Emergencias Críticas
+
+
+
+
+
+
+
+
+
+ {/* Quick Access Chips */}
+
+
+ Accesos Rápidos
+
+
+ {quickAccess.map((item) => (
+
+ {item.label}
+
+ ))}
+
+
+
+ {/* Recent Searches */}
+
+
+
+ Últimas Consultas
+
+
+
+
+ {recentSearches.map((item) => (
+
+ {item.title}
+
+
+ ))}
+
+
+
+ {/* Floating Emergency Button */}
+
+
+
);
};
-export default Index;
+export default Home;
diff --git a/src/pages/Patologias.tsx b/src/pages/Patologias.tsx
new file mode 100644
index 00000000..30316c3c
--- /dev/null
+++ b/src/pages/Patologias.tsx
@@ -0,0 +1,147 @@
+import { useState } from 'react';
+import { Wind, Heart, Brain, FlaskConical, Skull } from 'lucide-react';
+
+const tabs = [
+ { id: 'respiratorias', label: 'Respiratorias', icon: Wind },
+ { id: 'circulatorias', label: 'Circulatorias', icon: Heart },
+ { id: 'neurologicas', label: 'Neurológicas', icon: Brain },
+ { id: 'endocrinas', label: 'Endocrinas', icon: FlaskConical },
+ { id: 'intoxicaciones', label: 'Intoxicaciones', icon: Skull },
+];
+
+const patologias = {
+ respiratorias: [
+ {
+ title: 'Crisis Asmática',
+ clinica: 'Disnea, sibilancias, uso de musculatura accesoria, habla entrecortada',
+ actuacion: ['O2 alto flujo', 'Salbutamol nebulizado', 'Corticoides IV', 'Valorar adrenalina si severa'],
+ },
+ {
+ title: 'EPOC Reagudizado',
+ clinica: 'Aumento de disnea, cambio en esputo, aumento de tos',
+ actuacion: ['O2 controlado (SpO2 88-92%)', 'Broncodilatadores', 'Corticoides', 'ATB si sospecha infección'],
+ },
+ ],
+ circulatorias: [
+ {
+ title: 'SCA / IAM',
+ clinica: 'Dolor torácico opresivo, irradiado a brazo/mandíbula, sudoración, náuseas',
+ actuacion: ['ECG 12 derivaciones', 'O2 si SpO2 <94%', 'AAS 300mg', 'Nitroglicerina SL', 'Morfina si dolor intenso'],
+ },
+ {
+ title: 'Edema Agudo de Pulmón',
+ clinica: 'Disnea súbita, ortopnea, esputo rosado, crepitantes',
+ actuacion: ['Posición semisentado', 'O2 alto flujo / CPAP', 'Furosemida IV', 'Nitroglicerina', 'Morfina'],
+ },
+ ],
+ neurologicas: [
+ {
+ title: 'Ictus - Código Ictus',
+ clinica: 'Déficit neurológico súbito: paresia facial, debilidad brazo, alteración habla (FAST)',
+ actuacion: ['Hora de inicio síntomas', 'Glucemia', 'TA (no bajar si <220/120)', 'Código Ictus', 'Traslado urgente'],
+ },
+ {
+ title: 'Crisis Convulsiva',
+ clinica: 'Movimientos tónico-clónicos, pérdida consciencia, relajación esfínteres',
+ actuacion: ['Proteger de traumatismos', 'Posición lateral si cede', 'Midazolam si >5min', 'O2', 'Glucemia'],
+ },
+ ],
+ endocrinas: [
+ {
+ title: 'Hipoglucemia',
+ clinica: 'Glucemia <70 mg/dl, sudoración, temblor, confusión, taquicardia',
+ actuacion: ['Si consciente: glucosa oral', 'Si inconsciente: Glucosmon IV', 'Glucagón IM si no vía', 'Buscar causa'],
+ },
+ {
+ title: 'Cetoacidosis Diabética',
+ clinica: 'Hiperglucemia >250, aliento cetósico, náuseas, dolor abdominal',
+ actuacion: ['Fluidoterapia SSF', 'Insulina rápida', 'Monitorización K+', 'Buscar desencadenante'],
+ },
+ ],
+ intoxicaciones: [
+ {
+ title: 'Intoxicación por Opioides',
+ clinica: 'Miosis puntiforme, depresión respiratoria, bajo nivel consciencia',
+ actuacion: ['Vía aérea', 'Ventilación', 'Naloxona 0.4-2mg IV', 'Repetir cada 2-3 min si precisa'],
+ },
+ {
+ title: 'Intoxicación por Benzodiacepinas',
+ clinica: 'Somnolencia, ataxia, habla farfullante, depresión respiratoria',
+ actuacion: ['Vía aérea', 'Flumazenilo 0.2mg IV', 'Repetir hasta 1mg', 'Monitorización prolongada'],
+ },
+ ],
+};
+
+const Patologias = () => {
+ const [activeTab, setActiveTab] = useState('respiratorias');
+
+ const currentPatologias = patologias[activeTab as keyof typeof patologias] || [];
+
+ return (
+
+
+
Patologías
+
+ Clínica y actuación por sistemas
+
+
+
+ {/* System Tabs */}
+
+ {tabs.map((tab) => {
+ const Icon = tab.icon;
+ return (
+ setActiveTab(tab.id)}
+ className={`flex items-center gap-2 px-4 py-2 rounded-full text-sm font-medium whitespace-nowrap transition-colors ${
+ activeTab === tab.id
+ ? 'bg-secondary text-secondary-foreground'
+ : 'bg-muted text-muted-foreground hover:bg-accent'
+ }`}
+ >
+
+ {tab.label}
+
+ );
+ })}
+
+
+ {/* Patologies List */}
+
+ {currentPatologias.map((patologia, index) => (
+
+
+ {patologia.title}
+
+
+
+
+
+ Clínica
+
+
{patologia.clinica}
+
+
+
+
+ Actuación
+
+
+ {patologia.actuacion.map((paso, i) => (
+
+ {i + 1}
+ {paso}
+
+ ))}
+
+
+
+
+ ))}
+
+
+ );
+};
+
+export default Patologias;
diff --git a/src/pages/SoporteVital.tsx b/src/pages/SoporteVital.tsx
new file mode 100644
index 00000000..6fddb44e
--- /dev/null
+++ b/src/pages/SoporteVital.tsx
@@ -0,0 +1,80 @@
+import { useState, useEffect } from 'react';
+import { useSearchParams } from 'react-router-dom';
+import { procedures, getProceduresByCategory, Procedure } from '@/data/procedures';
+import ProcedureCard from '@/components/procedures/ProcedureCard';
+
+const subcategories = [
+ { id: 'todos', label: 'Todos' },
+ { id: 'rcp', label: 'RCP' },
+ { id: 'via_aerea', label: 'Vía Aérea' },
+ { id: 'shock', label: 'Shock' },
+];
+
+const SoporteVital = () => {
+ const [searchParams] = useSearchParams();
+ const highlightId = searchParams.get('id');
+ const [activeTab, setActiveTab] = useState('todos');
+
+ const soporteVitalProcedures = getProceduresByCategory('soporte_vital');
+
+ const filteredProcedures =
+ activeTab === 'todos'
+ ? soporteVitalProcedures
+ : soporteVitalProcedures.filter((p) => p.subcategory === activeTab);
+
+ // Sort to put highlighted procedure first
+ const sortedProcedures = [...filteredProcedures].sort((a, b) => {
+ if (a.id === highlightId) return -1;
+ if (b.id === highlightId) return 1;
+ return 0;
+ });
+
+ return (
+
+
+
Soporte Vital
+
+ Protocolos de emergencia y reanimación
+
+
+
+ {/* Subcategory Tabs */}
+
+ {subcategories.map((tab) => (
+ setActiveTab(tab.id)}
+ className={`px-4 py-2 rounded-full text-sm font-medium whitespace-nowrap transition-colors ${
+ activeTab === tab.id
+ ? 'bg-primary text-primary-foreground'
+ : 'bg-muted text-muted-foreground hover:bg-accent'
+ }`}
+ >
+ {tab.label}
+
+ ))}
+
+
+ {/* Procedures List */}
+
+ {sortedProcedures.map((procedure) => (
+
+ ))}
+
+
+ {sortedProcedures.length === 0 && (
+
+
+ No hay protocolos en esta categoría
+
+
+ )}
+
+ );
+};
+
+export default SoporteVital;
diff --git a/tailwind.config.ts b/tailwind.config.ts
index a1edb691..93c3651f 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -7,7 +7,7 @@ export default {
theme: {
container: {
center: true,
- padding: "2rem",
+ padding: "1rem",
screens: {
"2xl": "1400px",
},
@@ -57,33 +57,58 @@ export default {
border: "hsl(var(--sidebar-border))",
ring: "hsl(var(--sidebar-ring))",
},
+ emergency: {
+ critical: "hsl(var(--emergency-critical))",
+ high: "hsl(var(--emergency-high))",
+ medium: "hsl(var(--emergency-medium))",
+ low: "hsl(var(--emergency-low))",
+ },
+ success: "hsl(var(--success))",
+ warning: "hsl(var(--warning))",
+ info: "hsl(var(--info))",
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
+ fontFamily: {
+ sans: ["IBM Plex Sans", "system-ui", "-apple-system", "sans-serif"],
+ },
+ fontSize: {
+ "2xs": ["0.625rem", { lineHeight: "0.875rem" }],
+ },
+ minHeight: {
+ touch: "48px",
+ "touch-lg": "60px",
+ },
+ spacing: {
+ safe: "env(safe-area-inset-bottom)",
+ },
keyframes: {
"accordion-down": {
- from: {
- height: "0",
- },
- to: {
- height: "var(--radix-accordion-content-height)",
- },
+ from: { height: "0" },
+ to: { height: "var(--radix-accordion-content-height)" },
},
"accordion-up": {
- from: {
- height: "var(--radix-accordion-content-height)",
- },
- to: {
- height: "0",
- },
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: "0" },
+ },
+ pulse: {
+ "0%, 100%": { opacity: "1" },
+ "50%": { opacity: "0.5" },
+ },
+ "pulse-ring": {
+ "0%": { transform: "scale(0.95)", boxShadow: "0 0 0 0 hsl(var(--emergency-critical) / 0.7)" },
+ "70%": { transform: "scale(1)", boxShadow: "0 0 0 10px hsl(var(--emergency-critical) / 0)" },
+ "100%": { transform: "scale(0.95)", boxShadow: "0 0 0 0 hsl(var(--emergency-critical) / 0)" },
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
+ pulse: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",
+ "pulse-ring": "pulse-ring 2s infinite",
},
},
},