/* clinara — Landing page */ const TWEAKS = /*EDITMODE-BEGIN*/{ "theme": "light", "density": "comfortable", "accent": "azul", "showCarousel": true } /*EDITMODE-END*/; const ACCENTS = { azul: { primary: "#3B63A8", soft: "#BAD6EB", ink: "#091F5B" }, navy: { primary: "#091F5B", soft: "#BAD6EB", ink: "#091F5B" }, cielo: { primary: "#6F96D1", soft: "#BAD6EB", ink: "#091F5B" }, verde: { primary: "oklch(0.42 0.08 165)", soft: "oklch(0.94 0.025 165)", ink: "oklch(0.30 0.06 165)" } }; /* ---------------- Nav ---------------- */ const Nav = ({ onOpenDemo, mobileOpen, setMobileOpen, scrolled }) => ; const MobileDrawer = ({ open, onClose, onOpenDemo }) =>
clinara
Producto Especialidades Precios Seguridad Recursos
; /* ---------------- Hero with mock dashboard ---------------- */ const HeroMock = () => { const sparkData = [12, 18, 14, 22, 19, 28, 24, 32, 30, 38, 35, 44]; return (
Panel del consultorio
Hoy Semana Mes
Inicio
Pacientes
Agenda
Expedientes
Recetas
Reportes
Citas hoy
14
↑ 2 vs ayer
Pacientes activos
1,284
↑ 38 este mes
Consultas — últimas 12 semanas
MR
María Reyes
EXP-00482 · 32 a · F
Confirmada 10:30
JT
Javier Torres
EXP-00921 · 58 a · M
Seguimiento 11:15
SO
Sofía Ortega
EXP-01034 · 27 a · F
En espera 12:00
); }; const HeroLaptop = () => { const [stage, setStage] = React.useState("before"); // 'before' | 'transition' | 'after' const runSequence = React.useCallback(() => { setStage("before"); const t1 = setTimeout(() => setStage("transition"), 2000); const t2 = setTimeout(() => setStage("after"), 2900); return () => { clearTimeout(t1); clearTimeout(t2); }; }, []); React.useEffect(() => { const cleanup = runSequence(); return cleanup; }, [runSequence]); const url = stage === "before" ? "papel · expediente manual" : "clinara.mx / dashboard"; return (
{url}
Antes — expediente en papel Después — dashboard de clinara {stage === "before" && (
ANTES
)} {stage === "after" && (
DESPUÉS
)}
); }; const Hero = ({ onOpenDemo, onOpenVideo }) =>

El expediente médico que tu{" "} clínica realmente usa.

Software para clínicas y consultorios en México. Expedientes electrónicos, agenda inteligente, recetas digitales y reportes con IA — en una sola plataforma certificada NOM-024.

{/* Botón "Ver producto" oculto temporalmente */}
14 días de prueba
Sin tarjeta
Migración asistida
clinara.mx / dashboard
Dashboard de clinara
Receta enviada al paciente
3 confirmaciones por WhatsApp
+18% pacientes nuevos
; /* ---------------- Marquee reviews ---------------- */ const REVIEWS = [ { q: "Reduje el tiempo de documentación a la mitad. La integración con WhatsApp para confirmar citas cambió mi consultorio.", n: "Dra. María González", r: "Medicina Interna · CDMX", a: "MG", img: "https://i.pravatar.cc/120?img=47" }, { q: "Por fin un sistema pensado para México. Las recetas con CURP y firma digital me ahorran horas cada semana.", n: "Dr. Carlos Mendoza", r: "Cardiología · Monterrey", a: "CM", img: "https://i.pravatar.cc/120?img=12" }, { q: "Migramos 14,000 expedientes en papel sin perder un dato. El equipo de soporte estuvo con nosotros cada paso.", n: "Dra. Ana Rodríguez", r: "Pediatría · Guadalajara", a: "AR", img: "https://i.pravatar.cc/120?img=44" }, { q: "Los reportes me dieron visibilidad real del consultorio. Identifiqué patrones que llevaba años pasando por alto.", n: "Dr. Luis Herrera", r: "Endocrinología · Puebla", a: "LH", img: "https://i.pravatar.cc/120?img=33" }, { q: "Mis pacientes reciben sus recetas en el celular antes de salir del consultorio. El cambio de percepción fue inmediato.", n: "Dra. Patricia López", r: "Dermatología · Querétaro", a: "PL", img: "https://i.pravatar.cc/120?img=49" }, { q: "El módulo DICOM nos permite revisar resonancias junto con el paciente sin cambiar de pestaña. Indispensable.", n: "Dr. Roberto Sánchez", r: "Radiología · CDMX", a: "RS", img: "https://i.pravatar.cc/120?img=68" }]; const Marquee = () => { const items = [...REVIEWS, ...REVIEWS]; return (
{items.map((r, i) =>
{[...Array(5)].map((_, k) => )}
"{r.q}"
{r.n}
{r.n} {r.r}
)}
); }; /* ---------------- Logos ---------------- */ const Logos = () =>
Clínicas y consultorios que ya gestionan con clinara
Hospital del Valle
Clínica Polanco
Centro Médico Norte
Vida Pediátrica
Dermalia
Cardio MX
; /* ---------------- Clinic Showcase (full-bleed image bridge) ---------------- */ const ClinicShowcase = () =>
Clínica moderna con clinara
— Pensado para clínicas modernas

Tecnología que se siente natural en tu consultorio.

Desde la recepción hasta el alta — clinara conecta a todo tu equipo médico en una sola plataforma diseñada para la realidad de México.

1,200+médicos activos
320kconsultas anuales
NOM-024certificado
; /* ---------------- Features (interactive split) ---------------- */ const FEATURES = [ { title: "Expediente clínico electrónico", desc: "Historial completo del paciente — antecedentes, alergias, padecimiento actual, exploración, diagnóstico — en una sola vista. Plantillas por especialidad y campos personalizables.", panel: "exp" }, { title: "Agenda y confirmaciones por WhatsApp", desc: "Múltiples consultorios y médicos. Recordatorios automáticos por WhatsApp, SMS y correo. Lista de espera inteligente que rellena cancelaciones.", panel: "agenda" }, { title: "Recetas digitales con firma electrónica", desc: "Recetas válidas con CURP y firma electrónica avanzada. Catálogo de medicamentos con interacciones. Envío directo al paciente y a la farmacia.", panel: "rx" }, { title: "Reportes con IA y análisis poblacional", desc: "Resumen automático de consultas, alertas de patrones epidemiológicos en tu base, y dashboards de operación clínica y financiera.", panel: "insights" }]; const Panel = ({ id, active }) => { if (id === "exp") { return (
María Reyes Ortiz
EXP-00482 · F · 32 años · O+
Activa
Resumen Notas Estudios Recetas
TA
118/76
FC
72
SatO₂
98%
IMC
22.4
ALERGIASPenicilina (anafilaxia)
CRÓNICOSHipotiroidismo en tratamiento (2021)
ÚLT. CITA14 abr 2026 · Control trimestral
); } if (id === "agenda") { return (
clinara.mx / calendario
Calendario real de clinara
); } if (id === "agenda-old") { return (
Jueves 02 mayo
14 citas · 2 disponibles
10:30
María Reyes
Control trimestral
En consulta
11:15
Javier Torres
Seguimiento HTA
Confirmada
12:00
Sofía Ortega
Primera vez
Pendiente
12:45
Diego Cano
Resultados lab
Confirmada
); } if (id === "rx") { return (
Receta médica
FOLIO RX-2026-04812
Para: María Reyes Ortiz · CURP: REOM930514MDFYRR04
Levotiroxina sódica 100 mcg 1 tableta en ayunas, 30 min antes del desayuno · 30 días
Vitamina D3 2,000 UI 1 cápsula al día con la comida · 60 días
Firma electrónica avanzada · Dr. F. López Enviada al paciente
); } if (id === "insights") { return (
Resumen del consultorio · abril 2026
Pacientes nuevos
128
↑ 18% vs marzo
Tasa de retención
82%
↑ 4 puntos
Consultas por semana
{[42, 58, 51, 67, 62, 74, 71, 80, 78, 86, 92, 88].map((h, i) => )}
IA detectó 12 pacientes con criterios para tamizaje cardiovascular.
); } return null; }; const Features = () => { const [open, setOpen] = React.useState(0); return (
01 / Producto

Una plataforma completa, no seis herramientas pegadas con cinta.

Desde la primera cita hasta el seguimiento post-consulta — todo conectado, sin cambiar de pestaña ni copiar datos a mano.

{FEATURES.map((f, i) => )}
VISTA · {FEATURES[open].panel.toUpperCase()} {FEATURES.map((f, i) => )}
); }; /* ---------------- Patients Showcase ---------------- */ const SHOWCASE_SLIDES = [ { id: "pacientes", url: "clinara.mx / pacientes", img: "/landing/assets/app-pacientes.png", label: "Lista de pacientes" }, { id: "calendario", url: "clinara.mx / calendario", img: "/landing/assets/app-calendario.png", label: "Calendario integrado" }]; const PatientsShowcase = () => { const [active, setActive] = React.useState(0); React.useEffect(() => { const t = setInterval(() => setActive((a) => (a + 1) % SHOWCASE_SLIDES.length), 4500); return () => clearInterval(t); }, []); return (
02 / Pacientes & agenda

Cada paciente, organizado y a la mano.

Búsqueda instantánea, filtros por estado, antecedentes y especialidad. Calendario integrado con eventos por color, multi-médico y multi-consultorio. Toda la información clínica en un perfil único.

  • Búsqueda con prefijo P# (ID interno) o nombre
  • Calendario con vista mes / semana / día
  • Permisos por rol — recepción ve datos limitados
  • Importa desde Excel, papel o sistema anterior
{SHOWCASE_SLIDES.map((s, i) => )}
{SHOWCASE_SLIDES[active].url}
{SHOWCASE_SLIDES.map((s, i) => {s.label} )}
); }; /* ---------------- Specialties ---------------- */ const SPECIALTIES = [ { id: "general", name: "Medicina general", desc: "Plantillas SOAP, recordatorios de control, paquetes de revisión anual.", img: "/landing/assets/spec-medicina-general.jpg" }, { id: "pediatria", name: "Pediatría", desc: "Curvas de crecimiento OMS, esquema de vacunación CONAVA, percentiles automáticos.", img: "/landing/assets/spec-pediatria.jpg" }, { id: "ginecologia", name: "Ginecología", desc: "Calendario menstrual, controles obstétricos, plantillas de USG.", img: "/landing/assets/spec-ginecologia.jpg" }, { id: "cardio", name: "Cardiología", desc: "ECG digital, calculadoras de riesgo (FRS, ASCVD), reportes de holter.", img: "/landing/assets/spec-cardiologia.jpg" }, { id: "dermato", name: "Dermatología", desc: "Galería fotográfica antes/después, dermatoscopia, mapeo de lesiones.", img: "/landing/assets/spec-dermatologia.jpg" }, { id: "orto", name: "Ortopedia", desc: "Visor DICOM 2D/3D, plantillas de mediciones, planeación quirúrgica.", img: "/landing/assets/spec-ortopedia.jpg" }]; const Specialties = () => { const [active, setActive] = React.useState(SPECIALTIES[0].id); const cur = SPECIALTIES.find((s) => s.id === active); return (
02 / Especialidades

Configurado para tu especialidad, no para todas a la vez.

Plantillas, calculadoras y campos clínicos diseñados con médicos de cada área. Cambia de especialidad sin perder tu información.

{SPECIALTIES.map((s) => )}

{cur.name}

{cur.desc}

    {[ "Plantillas pre-cargadas y editables", "Calculadoras y escalas clínicas integradas", "Catálogo de medicamentos por especialidad", "Reportes específicos del área"]. map((t, i) =>
  • {t}
  • )}
{cur.name} {cur.name}
); }; /* ---------------- How it works ---------------- */ const Steps = () =>
03 / Implementación

De papel a digital en siete días, sin parar la clínica.

Un proceso de migración asistido por nuestro equipo. Tú sigues atendiendo; nosotros movemos los datos.

— Día 1

Diagnóstico y configuración

Mapeamos tu flujo actual, especialidades, plantillas y permisos por rol.

Diagnóstico y configuración
— Días 2 al 5

Migración de expedientes

Convertimos tus expedientes en papel, Excel u otro sistema al estándar NOM-024.

Migración de expedientes
— Días 6 al 7

Capacitación y go-live

Entrenamos a tu equipo en sesiones cortas. Acompañamiento en vivo el primer día.

Capacitación del equipo
; /* ---------------- Stats ---------------- */ const Stats = () =>
04 / Resultados

Números que importan.

Datos agregados de más de 1,400 consultorios y clínicas que usan clinara en México y Latinoamérica.

— Eficiencia
menos tiempo en documentación clínica.
— Pacientes
expedientes gestionados en plataforma.
— Satisfacción
de médicos recomienda clinara a un colega.
— Tiempo
promedio de implementación, expedientes incluidos.
; /* ---------------- Security ---------------- */ const Security = () =>
05 / Seguridad y cumplimiento

Construido para los requisitos de la práctica médica.

Cifrado de extremo a extremo, respaldos diarios y residencia de datos en México. Diseñado con apego a la NOM-024-SSA3-2012 y la LFPDPPP.

NOM-024-SSA3-2012
LFPDPPP
ISO/IEC 27001
HIPAA-ready
AES-256
Datos en MX
Respaldos 24/7
Seguridad y cumplimiento
Datos cifrados
    {[ { i: "lock", t: "Cifrado AES-256 en reposo", d: "Cada expediente, imagen y receta cifrado individualmente. Llaves rotadas cada 90 días." }, { i: "shield", t: "Bitácora de auditoría", d: "Cada acceso, edición y exportación queda registrado y disponible para auditorías." }, { i: "users", t: "Permisos granulares por rol", d: "Define qué ve y qué edita cada miembro del equipo: médicos, recepción, enfermería." }, { i: "file", t: "Respaldos geo-redundantes", d: "Tres copias en regiones distintas dentro de México. RTO < 4 horas, RPO < 15 minutos." }]. map((it, k) =>
  • {it.t}

    {it.d}

  • )}
; /* ---------------- Testimonial ---------------- */ const Testimonial = () =>

Pasamos de revisar expedientes en papel toda la tarde a cerrar el consultorio sin pendientes. clinara nos devolvió las noches a mi equipo.

Dr. Fernando López
Dr. Fernando López Director médico · Clínica del Valle (CDMX)
{REVIEWS.slice(0, 4).map((r, i) =>

"{r.q.split(".")[0]}."

{r.n}
{r.n} · {r.r}
)}
; /* ---------------- Pricing ---------------- */ const PLANS = [ { name: "Solo", tag: "Consultorio individual", price: 899, features: ["1 médico", "Pacientes ilimitados", "Agenda + WhatsApp", "Recetas digitales", "Soporte por correo"], cta: "Comenzar prueba", featured: false }, { name: "Clínica", tag: "Más popular", price: 2490, features: ["Hasta 8 médicos", "Multi-consultorio", "Reportes con IA", "Visor DICOM", "Capacitación incluida", "Soporte prioritario 24/7"], cta: "Solicitar demo", featured: true }, { name: "Hospital", tag: "Operación a escala", price: null, features: ["Médicos ilimitados", "API y webhooks", "Integración con LIS/RIS", "SSO y SAML", "SLA dedicado 99.95%", "Customer Success Manager"], cta: "Hablar con ventas", featured: false }]; const Pricing = ({ onOpenDemo }) => { const [annual, setAnnual] = React.useState(true); return (
06 / Precios

Precios simples, sin letras chiquitas.

Sin costo de implementación. Sin contratos forzosos. Cambia o cancela cuando quieras.

{PLANS.map((p, i) => { const price = p.price ? annual ? Math.round(p.price * 0.8) : p.price : null; return (
{p.tag}
{p.name}
{price !== null ? <>
${price.toLocaleString("es-MX")}
MXN / mes · facturado {annual ? "anual" : "mensual"}
: <>
A medida
Cotización personalizada
}
    {p.features.map((f, k) =>
  • {f}
  • )}
); })}
); }; /* ---------------- FAQ ---------------- */ const FAQS = [ { q: "¿Cumple con la NOM-024-SSA3-2012?", a: "Sí. clinara está construido sobre los lineamientos de la NOM-024 para expediente clínico electrónico, incluyendo estructura de datos, interoperabilidad y bitácora de eventos." }, { q: "¿Puedo migrar mis expedientes en papel?", a: "Sí. Nuestro equipo te acompaña en la migración: digitalización, OCR, validación humana y carga al sistema. Sin costo adicional en planes Clínica y Hospital." }, { q: "¿Funciona offline?", a: "Sí. La app de iPad y la versión web tienen modo offline para consultas. Los cambios se sincronizan automáticamente al recuperar conexión." }, { q: "¿Cómo recibo soporte si tengo dudas?", a: "Respondemos en menos de 4 horas hábiles vía soporte@clinara.mx o WhatsApp al +52 811 827 7967. Los planes Clínica y Hospital incluyen soporte prioritario 24/7 y un Customer Success Manager dedicado." }, { q: "¿Qué pasa con mis datos si dejo el servicio?", a: "Tus datos son tuyos. Exportamos todos tus expedientes en formato HL7-CDA y PDF firmados. Sin penalizaciones, sin trampas." }, { q: "¿Puedo integrar mi laboratorio o equipo de imagen?", a: "Sí. Integraciones nativas con los principales LIS/RIS de México y conectores HL7/FHIR para laboratorios y equipos DICOM." }]; const FAQ = () => { const [open, setOpen] = React.useState(0); return (
07 / Preguntas frecuentes

Lo que más nos preguntan.

¿No encuentras lo que buscas? Habla con nuestro equipo — respondemos en menos de 4 horas hábiles.

{FAQS.map((f, i) =>
setOpen(open === i ? -1 : i)}>
{f.q}
{f.a}
)}
); }; /* ---------------- CTA ---------------- */ const CTA = ({ onOpenDemo }) =>

¿Listo para transformar
tu práctica médica?

Demo personalizada de 30 minutos con un especialista clínico. Sin presiones, sin guion enlatado.

Ver precios
; /* ---------------- Footer ---------------- */ const Footer = () =>
© 2026 Clinara Tecnologías Médicas, S.A. de C.V. · CDMX, México Hecho con cuidado por médicos e ingenieros · v4.2
; /* ---------------- Demo modal ---------------- */ const DemoModal = ({ open, onClose }) => { const [submitted, setSubmitted] = React.useState(false); const [submitting, setSubmitting] = React.useState(false); const [errorMsg, setErrorMsg] = React.useState(""); const [form, setForm] = React.useState({ nombre: "", correo: "", telefono: "", clinica: "", tamano: "1-3" }); React.useEffect(() => { if (!open) { setTimeout(() => { setSubmitted(false); setErrorMsg(""); }, 300); } }, [open]); const handleSubmit = async (e) => { e.preventDefault(); if (submitting) return; setSubmitting(true); setErrorMsg(""); const csrfMeta = document.querySelector('meta[name="csrf-token"]'); const token = csrfMeta ? csrfMeta.content : ""; try { const res = await fetch("/demo_requests", { method: "POST", credentials: "same-origin", headers: { "Content-Type": "application/json", "Accept": "application/json", "X-CSRF-Token": token }, body: JSON.stringify(form) }); const data = await res.json().catch(() => ({})); if (res.ok && data.ok) { setSubmitted(true); } else { setErrorMsg(data.error || "No pudimos enviar tu solicitud. Intenta de nuevo."); } } catch (err) { setErrorMsg("Error de conexión. Verifica tu internet e intenta de nuevo."); } finally { setSubmitting(false); } }; return (
e.stopPropagation()}> {!submitted ? <>

Agenda tu demo

30 min con un especialista. Te mostramos cómo funcionaría con tu flujo.

{errorMsg &&
{errorMsg}
}
setForm({ ...form, nombre: e.target.value })} placeholder="Dra. Ana Rivera" />
setForm({ ...form, correo: e.target.value })} placeholder="ana@clinica.mx" />
setForm({ ...form, telefono: e.target.value })} placeholder="+52 81 1234 5678" autoComplete="tel" pattern="[0-9+\s\-()]{8,}" />
setForm({ ...form, clinica: e.target.value })} placeholder="Clínica del Valle" />
:

¡Recibimos tu solicitud!

Te contactamos en menos de 4 horas hábiles para coordinar tu demo. Revisa tu correo.

}
); }; /* ---------------- WhatsApp floating ---------------- */ const WhatsAppFloat = () => ¿Hablamos por WhatsApp? ; const Tweaks = ({ tweaks, setTweak }) => setTweak("theme", v)} options={[{ value: "light", label: "Claro" }, { value: "dark", label: "Oscuro" }]} /> setTweak("accent", v)} options={[ { value: "azul", label: "Azul Clinara" }, { value: "navy", label: "Navy" }, { value: "cielo", label: "Cielo" }, { value: "verde", label: "Verde clínico" }] } /> setTweak("density", v)} options={[{ value: "comfortable", label: "Cómodo" }, { value: "cozy", label: "Compacto" }]} /> setTweak("showCarousel", v)} /> ; /* ---------------- Video modal ---------------- */ const VideoModal = ({ open, onClose }) => { const videoRef = React.useRef(null); React.useEffect(() => { if (!open && videoRef.current) { videoRef.current.pause(); videoRef.current.currentTime = 0; } if (open) { const onKey = (e) => { if (e.key === "Escape") onClose(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); } }, [open, onClose]); return (
e.stopPropagation()} style={{ position: "relative", width: "min(960px, 92vw)", background: "#000", borderRadius: 18, overflow: "hidden", boxShadow: "0 30px 80px -20px rgba(0,0,0,0.6)" }}>
); }; /* ---------------- App ---------------- */ const App = () => { const [tweaks, setTweak] = useTweaks(TWEAKS); const [demoOpen, setDemoOpen] = React.useState(false); const [videoOpen, setVideoOpen] = React.useState(false); const [mobileOpen, setMobileOpen] = React.useState(false); const [scrolled, setScrolled] = React.useState(false); React.useEffect(() => { document.documentElement.setAttribute("data-theme", tweaks.theme); document.documentElement.setAttribute("data-density", tweaks.density); const a = ACCENTS[tweaks.accent] || ACCENTS.azul; document.documentElement.style.setProperty("--primary", a.primary); document.documentElement.style.setProperty("--primary-soft", a.soft); document.documentElement.style.setProperty("--primary-ink", a.ink); }, [tweaks]); React.useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 80); window.addEventListener("scroll", onScroll); return () => window.removeEventListener("scroll", onScroll); }, []); React.useEffect(() => { const obs = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) e.target.classList.add("in"); }); }, { threshold: 0.12 }); document.querySelectorAll(".scroll-reveal").forEach((el) => obs.observe(el)); return () => obs.disconnect(); }, []); return ( <>