Landing
Sitio público de marketing de ixiclinic (ixiclinic.com) — Next.js 16 con SSG multipágina, páginas de módulo data-driven y formulario de demo.
La landing (apps/landing) es el sitio público de marketing y captación de demos de ixiclinic.
Migró de Vite SPA a Next.js 16 (App Router), por lo que ahora es multipágina y se prerenderiza
estáticamente (SSG) para mejor SEO.
| Stack | Next.js 16 (App Router, SSG), Tailwind 4 |
| Puerto local | 5174 (next dev --port 5174) |
| Producción | ixiclinic.com (Vercel) |
| Paquete | @ixiclinic/landing |
Nota: A diferencia del resto del monorepo, este paquete no depende de
@ixiclinic/typesni del API en build; es un sitio estático autónomo. Por eso sudevde Turbo no espera al^build.
Stack y animaciones
- Next.js 16 con
reactStrictMode. La configuración (apps/landing/next.config.ts) redirige/docsy/docs/:path*ahttps://docs.ixiclinic.com(la documentación vive en su propio subdominio). - Tailwind 4 vía
@tailwindcss/postcss. - Framer Motion (
framer-motion) para las animaciones y transiciones (por ejemplo, el modal del formulario de demo). La fuente es Geist (geist) y los iconoslucide-react.
Nota: Las animaciones se implementan únicamente con Framer Motion.
Páginas (apps/landing/src/app/)
App Router con rutas estáticas y una ruta dinámica por módulo:
| Ruta | Contenido |
|---|---|
/ (page.tsx) | Home con las secciones de marketing. |
/plataforma | Índice de módulos de la plataforma (grid). |
/plataforma/[slug] | Página de detalle por módulo (data-driven). |
/precios | Planes y precios. |
/contacto | Contacto y solicitud de demo. |
/terminos, /privacidad | Legales. |
Páginas de módulo /plataforma/[slug]
Son data-driven: el contenido de cada módulo vive en apps/landing/src/lib/features.ts
(array FEATURES, cada entrada con slug, name, headline, lead, sections, related,
icono y color de acento). La página (apps/landing/src/app/plataforma/[slug]/page.tsx) hace
SSG con generateStaticParams() (un parámetro por cada feature) y generateMetadata() para
el SEO por página; un slug inexistente devuelve notFound(). Para añadir un nuevo módulo solo se
agrega una entrada a FEATURES.
Formulario de demo
El componente cliente apps/landing/src/components/demo-form.tsx abre un modal y hace
POST a /api/saas/demos (ruta pública del API; ver
Console y el módulo demos). El cuerpo enviado:
{
labName: string;
contactName: string;
email: string;
phone: string;
labSize: string;
notes: string;
}La URL del API se resuelve con NEXT_PUBLIC_API_URL y, en su defecto, https://api.ixiclinic.com
cuando el host termina en ixiclinic.com, o http://localhost:5000 en local.
Build y despliegue
next build produce el sitio estático. Despliega automáticamente en Vercel al hacer push a
main (apps/landing/vercel.json fija framework: nextjs). Ver
Operaciones.