Cómo construir una pantalla paso a paso. Una receta única replicable para todas las pantallas del hospital.
@toscana/sih-ui.apps/web ├── src/ │ ├── app // Bootstrapping, providers, layout principal │ ├── contexts // (subdominios) admision/ ce/ er/ hosp/ quirofano/ farmacia/ ... │ │ └── ce/ │ │ ├── pages/ // ConsultaList.tsx · ConsultaDetail.tsx │ │ ├── components/ // FormaConsulta.tsx │ │ ├── api/ // useConsultas.ts (TanStack) │ │ └── schemas/ // zod schemas compartidos │ ├── shared // ui, hooks, utils, i18n, design-tokens │ └── routes // Definición de rutas y guards ├── tests/ // Vitest + Playwright └── public/ // assets estáticos · iconos · sonidos de alerta
| Token | Valor | Uso |
|---|---|---|
--c-primary | #0b3d91 (azul institucional) | Encabezados, botones primarios |
--c-accent | #2D9C9C (verde Toscana) | CTAs, estados positivos |
--c-danger | #dc2626 | Triaje rojo · alertas críticas |
--c-warn | #f59e0b | Triaje amarillo · advertencias |
--c-ok | #10b981 | Resultados normales · éxito |
| Tipografía | Inter 400/500/700 (UI) · Lora 400/700 (encabezados clínicos) | Jerarquía consistente |
| Spacing | Escala 4 / 8 / 12 / 16 / 24 / 32 px | Ritmo vertical de 8 px |
| Radio | 4 (chip) · 8 (input) · 12 (card) · 9999 (pill) | Coherencia |
| Sombra | 0 4px 14px rgba(0,0,0,0.05) (card) · 0 8px 22px rgba(11,61,145,.15) (hover) | Profundidad |
openapi-typescript.schemas/. Puede ser el mismo que valida el backend (compartido por monorepo).api/useConsultas.ts: useQuery para lectura, useMutation con onMutate optimista, invalidación de keys jerárquicas.pages/ConsultaDetail.tsx: orquesta layout, llama al hook, maneja estados isLoading · isError · data.useForm({ resolver: zodResolver(schema) }). Usar componentes de @toscana/sih-ui: <Field>, <Select>, <DatePicker>, <CodeSearch> (CIE-10/ATC).<ErrorBanner> con trace_id visible para soporte.label+aria-describedby, contraste AA, sin trampas de foco. Lector de pantalla anuncia cambios de estado.<FormattedMessage id="ce.title" />. Fechas con <FormattedDate /> en zona America/Guatemala.useLiveBoard(); reconectar con backoff exponencial; mostrar indicador de conexión.React.lazy por ruta · prefetch en hover · imágenes WebP · listas virtualizadas para censos >200 ítems.pnpm build · servir desde NGINX con cache-control agresivo en hash y cero en index.html.| Rol | Pantallas |
|---|---|
| Admisión | Buscar paciente · Registrar paciente · Emitir carnet QR · Abrir episodio CE/ER/Hosp |
| Médico CE | Lista de citas · Expediente · Anamnesis · Receta · Órdenes de lab/imagen · Alta |
| Médico ER | Tablero de triaje (vivo) · Sala de choque · Observación 24 h · Notas seriadas |
| Enfermería | Triaje Manchester · Signos vitales · Censo de cama · Dispensación · Hoja de medicación |
| Médico Hosp | Pase de visita · Evolución · Órdenes · Alta hospitalaria |
| Quirófano | Programación semanal · Hoja operatoria · Checklist OMS · Recursos |
| Laboratorio | Bandeja de órdenes · Validación · Liberación de resultados · Estadística |
| Farmacia | Recetas pendientes · Dispensación · Inventario · Vencimientos |
| Obstetricia | Partograma · Parto · Recién nacido · SIGSA-4/5 |
| Estadística | Reportes SIGSA · Vigilancia EPI · Producción |
| Admin/Finanzas | RRHH · Presupuesto · Compras · Facturación · Tableros |
| Dirección | Tablero ejecutivo · Censo · Producción · Ejecución presupuestaria · Indicadores MSPAS |