# Arquitectura para Guías de Refuerzo - EMERGES TES **Diseño de Sistema Paralelo para Modo Formativo** --- ## 1️⃣ DIAGNÓSTICO TÉCNICO (Solo Lectura) ### 1.1 Partes REUTILIZABLES Sin Cambios **✅ Componentes UI Base (shadcn/ui)** - **Ubicación:** `src/components/ui/` (51 componentes) - **Razón:** Componentes modulares, bien diseñados, independientes - **Uso:** Todos los componentes (Button, Card, Badge, Tabs, etc.) - **Riesgo:** ⚠️ Ninguno - Son componentes base **✅ Sistema de Variables CSS** - **Ubicación:** `src/index.css` - **Razón:** Centralizado, permite cambios globales sin tocar componentes - **Uso:** Variables de color, espaciado, tipografía - **Riesgo:** ⚠️ Ninguno - Sistema de diseño base **✅ Hooks Personalizados** - **Ubicación:** `src/hooks/` - **Componentes:** - `useFavorites.ts` - Gestión de favoritos - `useSearchHistory.ts` - Historial de búsquedas - `usePWAInstall.ts` - Instalación PWA - `useServiceWorker.ts` - Service Worker - **Razón:** Lógica reutilizable, bien implementada - **Uso:** Favoritos y historial para guías de refuerzo - **Riesgo:** ⚠️ Ninguno - Hooks independientes **✅ Utilidades** - **Ubicación:** `src/lib/utils.ts`, `src/utils/markdownUtils.ts` - **Razón:** Funciones puras, sin dependencias de UI - **Uso:** `cn()` para clases, procesamiento de Markdown - **Riesgo:** ⚠️ Ninguno - Utilidades puras **✅ Componentes Compartidos** - **Ubicación:** `src/components/shared/` - **Componentes:** - `Badge.tsx` - Badges con variantes - `EmergencyButton.tsx` - Botones de emergencia - **Razón:** Componentes específicos del dominio, bien diseñados - **Uso:** Badges para identificar tipo de guía, botones de navegación - **Riesgo:** ⚠️ Ninguno - Componentes independientes **✅ Sistema PWA** - **Ubicación:** `public/sw.js`, `public/manifest.json` - **Razón:** Sistema completo, funcional - **Uso:** Guías de refuerzo funcionarán offline automáticamente - **Riesgo:** ⚠️ Ninguno - Sistema independiente ### 1.2 Partes a ENVOLVER o EXTENDER (No Modificar) **🔶 MarkdownViewer** - **Ubicación:** `src/components/content/MarkdownViewer.tsx` - **Estado Actual:** Carga archivos desde `public/`, renderiza Markdown - **Estrategia:** Crear `GuideMarkdownViewer.tsx` que envuelva/extienda MarkdownViewer - **Razón:** No modificar el existente, crear variante específica para guías - **Extensión:** - Cargar desde `docs/consolidado/` (no `public/`) - Estilos específicos para guías (más espaciado, tipografía diferente) - Navegación entre secciones - Badges de "Modo Formación" - **Riesgo:** ⚠️ Bajo - Nuevo componente, no toca el existente **🔶 Layout Actual (App.tsx)** - **Ubicación:** `src/App.tsx` - **Estado Actual:** Layout único hardcodeado - **Estrategia:** Crear `GuideLayout.tsx` nuevo, usar condicionalmente en App.tsx - **Razón:** No modificar layout actual, agregar layout alternativo - **Extensión:** - Layout específico para guías (más espaciado, sin BottomNav opcional) - Badge de "Modo Formación" visible - Navegación entre secciones de guía - **Riesgo:** ⚠️ Medio - Requiere cambio mínimo en App.tsx (condicional) **🔶 Sistema de Rutas** - **Ubicación:** `src/App.tsx` (líneas 71-99) - **Estado Actual:** Rutas hardcodeadas - **Estrategia:** Agregar rutas nuevas sin modificar las existentes - **Razón:** Rutas nuevas no afectan rutas existentes - **Extensión:** - `/guia-refuerzo/:guia` - Índice de guía - `/guia-refuerzo/:guia/seccion/:numero` - Sección específica - **Riesgo:** ⚠️ Bajo - Solo agregar, no modificar **🔶 Header y BottomNav** - **Ubicación:** `src/components/layout/Header.tsx`, `BottomNav.tsx` - **Estado Actual:** Funcionales, visibles en todas las páginas - **Estrategia:** Usar condicionalmente, ocultar BottomNav en guías si es necesario - **Razón:** No modificar componentes, solo controlar visibilidad - **Extensión:** - Badge de modo en Header (opcional) - Ocultar BottomNav en guías (opcional, según diseño) - **Riesgo:** ⚠️ Bajo - Solo control de visibilidad ### 1.3 Partes NO Deben Tocarse **🔴 App.tsx - Estructura Principal** - **Razón:** Componente raíz, cualquier cambio puede romper toda la app - **Estrategia:** Cambios mínimos y reversibles (condicionales) - **Riesgo:** 🔴 Alto - Solo cambios condicionales seguros **🔴 Componentes de Layout Actuales** - **Componentes:** Header.tsx, BottomNav.tsx, Footer.tsx - **Razón:** Usados en toda la app, cambios afectan todas las páginas - **Estrategia:** No modificar, solo usar condicionalmente - **Riesgo:** 🔴 Alto - No modificar directamente **🔴 Páginas Existentes** - **Ubicación:** `src/pages/` - **Razón:** Funcionales, no deben romperse - **Estrategia:** No tocar, crear páginas nuevas - **Riesgo:** 🔴 Alto - No modificar **🔴 Estructura de Datos Existente** - **Ubicación:** `src/data/procedures.ts`, `drugs.ts`, `manual-index.ts` - **Razón:** Usados por páginas existentes - **Estrategia:** Crear nuevos archivos de datos para guías - **Riesgo:** 🔴 Alto - No modificar **🔴 Sistema de Búsqueda Actual** - **Ubicación:** `src/components/layout/SearchModal.tsx` - **Razón:** Funcional, usado en toda la app - **Estrategia:** No modificar, extender después si es necesario - **Riesgo:** 🔴 Alto - No modificar inicialmente ### 1.4 Patrones Visuales Reutilizables **✅ Patrón: Card Expandible** - **Componente:** ProcedureCard, DrugCard - **Aplicación:** Cards de guías de refuerzo con secciones expandibles - **Ventaja:** Patrón conocido, consistente con app actual **✅ Patrón: Tabs Horizontales** - **Componente:** RCP.tsx, Farmacos.tsx, Herramientas.tsx - **Aplicación:** Tabs para navegar entre secciones de guía (1-8) - **Ventaja:** Patrón conocido, mobile-friendly **✅ Patrón: Header de Página** - **Componente:** RCP.tsx, Ictus.tsx - **Aplicación:** Header con icono, título, subtítulo para guías - **Ventaja:** Consistente con páginas existentes **✅ Patrón: Navegación Anterior/Siguiente** - **Componente:** ManualViewer.tsx - **Aplicación:** Navegación entre secciones de guía - **Ventaja:** Patrón conocido, útil para contenido largo **✅ Patrón: Badge de Prioridad** - **Componente:** Badge.tsx - **Aplicación:** Badge "Modo Formación" para diferenciar de operativo - **Ventaja:** Consistente con sistema de badges existente **✅ Patrón: Empty State** - **Componente:** SearchModal.tsx, Farmacos.tsx - **Aplicación:** Estados vacíos en búsqueda de guías - **Ventaja:** Consistente con UX actual --- ## 2️⃣ ARQUITECTURA PARALELA PROPUESTA ### 2.1 Estructura de Carpetas Nueva ``` src/ ├── layouts/ # NUEVO: Layouts alternativos │ ├── DefaultLayout.tsx # Layout actual (wrapper) │ └── GuideLayout.tsx # Layout específico para guías │ ├── views/ # NUEVO: Vistas por modo │ ├── formativo/ # Vistas de modo formativo │ │ ├── GuideIndex.tsx # Índice de guías disponibles │ │ ├── GuideViewer.tsx # Visualizador de guía completa │ │ └── GuideSectionViewer.tsx # Visualizador de sección individual │ │ │ └── operativo/ # Vistas de modo operativo (actual) │ └── [mantener estructura actual] │ ├── components/ │ ├── guide/ # NUEVO: Componentes específicos de guías │ │ ├── GuideCard.tsx # Card de guía en lista │ │ ├── GuideSectionCard.tsx # Card de sección expandible │ │ ├── GuideNavigation.tsx # Navegación entre secciones │ │ ├── GuideHeader.tsx # Header específico de guía │ │ ├── GuideMarkdownViewer.tsx # Viewer de Markdown para guías │ │ └── GuideModeBadge.tsx # Badge "Modo Formación" │ │ │ └── [mantener estructura actual] │ ├── data/ │ ├── guides-index.ts # NUEVO: Índice de guías de refuerzo │ └── [mantener estructura actual] │ └── [resto de estructura actual] ``` ### 2.2 Componentes Nuevos Necesarios **1. GuideLayout.tsx** - **Propósito:** Layout específico para guías de refuerzo - **Características:** - Header con badge "Modo Formación" - Sin BottomNav (o opcional) - Más espaciado vertical - Navegación entre secciones visible - **Dependencias:** Header (reutilizado), Footer (reutilizado) **2. GuideIndex.tsx** - **Propósito:** Lista de guías de refuerzo disponibles - **Características:** - Cards de guías con iconos - Búsqueda/filtrado - Badge "Modo Formación" - **Dependencias:** GuideCard, Badge, SearchModal (reutilizado) **3. GuideViewer.tsx** - **Propósito:** Visualizador de guía completa con navegación - **Características:** - Tabs para secciones (1-8) - Navegación anterior/siguiente - Breadcrumbs opcionales - Enlace a protocolo operativo - **Dependencias:** GuideMarkdownViewer, GuideNavigation, Tabs (reutilizado) **4. GuideSectionViewer.tsx** - **Propósito:** Visualizador de sección individual - **Características:** - Carga sección específica - Navegación anterior/siguiente - Enlace a protocolo operativo - **Dependencias:** GuideMarkdownViewer, GuideNavigation **5. GuideMarkdownViewer.tsx** - **Propósito:** Viewer de Markdown específico para guías - **Características:** - Extiende MarkdownViewer - Carga desde `docs/consolidado/` - Estilos específicos (más espaciado, tipografía) - Badges de "Modo Formación" - **Dependencias:** MarkdownViewer (envuelto) **6. GuideCard.tsx** - **Propósito:** Card de guía en lista - **Características:** - Icono, título, descripción - Badge "Modo Formación" - Enlace a guía - **Dependencias:** Badge, Card (reutilizado) **7. GuideNavigation.tsx** - **Propósito:** Navegación entre secciones - **Características:** - Botones anterior/siguiente - Indicador de sección actual - Enlace a protocolo operativo - **Dependencias:** Button, ChevronLeft, ChevronRight (reutilizado) **8. GuideModeBadge.tsx** - **Propósito:** Badge distintivo "Modo Formación" - **Características:** - Color distintivo (azul/verde, diferente de emergencia) - Texto claro - Visible en Header y páginas - **Dependencias:** Badge (reutilizado) ### 2.3 Componentes Actuales Reutilizados **✅ Componentes UI Base:** - Button, Card, Badge, Tabs, Separator - Todos los componentes de `src/components/ui/` **✅ Componentes de Layout:** - Header (con badge opcional) - Footer (reutilizado) - SearchModal (reutilizado, extender después) **✅ Componentes Compartidos:** - Badge (reutilizado, nueva variante "formativo") - BackButton (reutilizado) **✅ Hooks:** - useFavorites (para favoritar guías) - useSearchHistory (para historial de guías) ### 2.4 Conexión con Archivos Markdown **Estructura de Archivos:** ``` docs/consolidado/ ├── SECCION_01_ABCDE_OPERATIVO.md ├── SECCION_02_ABCDE_OPERATIVO.md ├── ... ├── SECCION_08_ABCDE_OPERATIVO.md ├── SECCION_01_RCP_ADULTO_SVB.md ├── ... ``` **Estrategia de Carga:** 1. **Índice de Guías:** `src/data/guides-index.ts` - Define guías disponibles - Mapea guía → archivos de secciones - Metadatos (título, descripción, icono) 2. **Carga Dinámica:** - GuideMarkdownViewer carga desde `docs/consolidado/` - Ruta: `/docs/consolidado/SECCION_XX_NOMBRE.md` - Fetch en runtime (igual que MarkdownViewer actual) 3. **Navegación:** - GuideNavigation maneja navegación entre secciones - URLs: `/guia-refuerzo/:guia/seccion/:numero` ### 2.5 Rutas Nuevas Propuestas **Rutas para Guías de Refuerzo:** ```typescript /guia-refuerzo → GuideIndex (lista de guías) /guia-refuerzo/:guia → GuideViewer (guía completa con tabs) /guia-refuerzo/:guia/seccion/:numero → GuideSectionViewer (sección individual) ``` **Ejemplos:** - `/guia-refuerzo/abcde-operativo` → Guía ABCDE completa - `/guia-refuerzo/abcde-operativo/seccion/1` → Sección 1 de ABCDE - `/guia-refuerzo/rcp-adulto-svb` → Guía RCP Adulto SVB completa **Integración en App.tsx:** ```typescript // Agregar después de rutas existentes, sin modificar las actuales } /> } /> } /> ``` --- ## 3️⃣ PRIMEROS PASOS IMPLEMENTABLES (SEGUROS) ### 3.1 Checklist de Pasos Iniciales **Fase 1: Preparación (Sin Código)** - [ ] Crear carpeta `src/layouts/` - [ ] Crear carpeta `src/views/formativo/` - [ ] Crear carpeta `src/components/guide/` - [ ] Crear archivo `src/data/guides-index.ts` (estructura vacía) **Fase 2: Índice de Guías (Datos)** - [ ] Crear `src/data/guides-index.ts` con estructura TypeScript - [ ] Definir interface `Guide` y `GuideSection` - [ ] Agregar 2-3 guías de ejemplo (ABCDE, RCP) - [ ] Mapear archivos Markdown a secciones **Fase 3: Componentes Base** - [ ] Crear `GuideModeBadge.tsx` (badge simple) - [ ] Crear `GuideCard.tsx` (card básico) - [ ] Crear `GuideMarkdownViewer.tsx` (wrapper de MarkdownViewer) **Fase 4: Layout de Prueba** - [ ] Crear `GuideLayout.tsx` (layout básico) - [ ] Incluir Header con badge - [ ] Sin BottomNav (o condicional) - [ ] Contenedor con más espaciado **Fase 5: Vista de Prueba** - [ ] Crear `GuideIndex.tsx` (lista simple) - [ ] Mostrar 2-3 guías con GuideCard - [ ] Sin funcionalidad completa, solo visual **Fase 6: Integración Mínima** - [ ] Agregar ruta `/guia-refuerzo` en App.tsx - [ ] Usar GuideLayout condicionalmente - [ ] Probar que no rompe rutas existentes ### 3.2 Código Inicial (Implementable Ya) #### Paso 1: Estructura de Datos (`src/data/guides-index.ts`) ```typescript export interface GuideSection { numero: number; titulo: string; archivo: string; // Ej: "SECCION_01_ABCDE_OPERATIVO.md" ruta: string; // Ej: "/docs/consolidado/SECCION_01_ABCDE_OPERATIVO.md" } export interface Guide { id: string; // Ej: "abcde-operativo" titulo: string; // Ej: "ABCDE Operativo" descripcion: string; icono: string; // Nombre de icono de lucide-react secciones: GuideSection[]; protocoloOperativo?: { titulo: string; ruta: string; // Ej: "/manual/parte-i-fundamentos/bloque-1-procedimientos-basicos/1.2.2" }; } export const guidesIndex: Guide[] = [ { id: "abcde-operativo", titulo: "ABCDE Operativo", descripcion: "Guía de refuerzo para comprender el enfoque ABCDE como estructura mental de priorización", icono: "Activity", secciones: [ { numero: 1, titulo: "Introducción y Contexto", archivo: "SECCION_01_ABCDE_OPERATIVO.md", ruta: "/docs/consolidado/SECCION_01_ABCDE_OPERATIVO.md" }, { numero: 2, titulo: "Explicación Clínica y Fisiopatología", archivo: "SECCION_02_ABCDE_OPERATIVO.md", ruta: "/docs/consolidado/SECCION_02_ABCDE_OPERATIVO.md" }, // ... resto de secciones ], protocoloOperativo: { titulo: "ABCDE Operativo", ruta: "/manual/parte-i-fundamentos/bloque-1-procedimientos-basicos/1.2.2" } }, // ... más guías ]; export function getGuideById(id: string): Guide | undefined { return guidesIndex.find(g => g.id === id); } export function getGuideSection(guideId: string, numero: number): GuideSection | undefined { const guide = getGuideById(guideId); return guide?.secciones.find(s => s.numero === numero); } ``` #### Paso 2: Badge de Modo (`src/components/guide/GuideModeBadge.tsx`) ```typescript import Badge from '@/components/shared/Badge'; export const GuideModeBadge = () => { return ( Modo Formación ); }; ``` #### Paso 3: Layout de Guías (`src/layouts/GuideLayout.tsx`) ```typescript import Header from '@/components/layout/Header'; import Footer from '@/components/layout/Footer'; import { GuideModeBadge } from '@/components/guide/GuideModeBadge'; interface GuideLayoutProps { children: React.ReactNode; onSearchClick: () => void; onMenuClick: () => void; } export const GuideLayout = ({ children, onSearchClick, onMenuClick }: GuideLayoutProps) => { return (
{children}
); }; ``` #### Paso 4: Card de Guía (`src/components/guide/GuideCard.tsx`) ```typescript import { Link } from 'react-router-dom'; import { LucideIcon } from 'lucide-react'; import { Guide } from '@/data/guides-index'; import { GuideModeBadge } from './GuideModeBadge'; import * as Icons from 'lucide-react'; interface GuideCardProps { guide: Guide; } export const GuideCard = ({ guide }: GuideCardProps) => { const Icon = (Icons as any)[guide.icono] as LucideIcon || Icons.BookOpen; return (

{guide.titulo}

{guide.descripcion}

{guide.secciones.length} secciones
); }; ``` #### Paso 5: Índice de Guías (`src/views/formativo/GuideIndex.tsx`) ```typescript import { guidesIndex } from '@/data/guides-index'; import { GuideCard } from '@/components/guide/GuideCard'; export const GuideIndex = () => { return (

Guías de Refuerzo

Contenido formativo para comprensión profunda de protocolos

{guidesIndex.map((guide) => ( ))}
); }; ``` #### Paso 6: Integración Mínima en App.tsx ```typescript // Agregar al inicio del archivo (imports) import { GuideLayout } from '@/layouts/GuideLayout'; import { GuideIndex } from '@/views/formativo/GuideIndex'; // Agregar en el componente App (dentro de Routes, después de rutas existentes) setIsSearchOpen(true)} onMenuClick={() => setIsMenuOpen(true)} > } /> ``` ### 3.3 Verificación de Seguridad **✅ No Modifica:** - Layout actual (DefaultLayout sigue igual) - Rutas existentes (solo agrega nuevas) - Componentes existentes (solo crea nuevos) - Estructura de datos existente (solo crea nuevo archivo) **✅ Fácil de Revertir:** - Eliminar carpeta `src/layouts/` - Eliminar carpeta `src/views/formativo/` - Eliminar carpeta `src/components/guide/` - Eliminar archivo `src/data/guides-index.ts` - Eliminar ruta en App.tsx **✅ Incremental:** - Cada paso es independiente - Puede probarse por separado - No requiere funcionalidad completa --- ## Resumen Ejecutivo ### Diagnóstico - **Reutilizables:** Componentes UI, hooks, utilidades, sistema PWA - **Extensibles:** MarkdownViewer (wrapper), Layout (nuevo), Rutas (agregar) - **No tocar:** App.tsx estructura, componentes layout, páginas existentes - **Patrones:** Cards, tabs, navegación anterior/siguiente ### Arquitectura - **Nuevas carpetas:** `layouts/`, `views/formativo/`, `components/guide/` - **Nuevos componentes:** 8 componentes específicos de guías - **Rutas nuevas:** `/guia-refuerzo`, `/guia-refuerzo/:guia`, `/guia-refuerzo/:guia/seccion/:numero` - **Datos:** `guides-index.ts` mapea guías a archivos Markdown ### Pasos Iniciales 1. Crear estructura de carpetas 2. Crear `guides-index.ts` con datos 3. Crear componentes base (Badge, Card, Layout) 4. Crear vista de prueba (GuideIndex) 5. Integrar ruta mínima en App.tsx **Estado:** Listo para implementación incremental y segura --- **Documento generado:** Arquitectura para Guías de Refuerzo **Fecha:** 2025-01-XX **Estado:** Diseño completo, listo para implementación