Acerca de NicaLink
NicaLink es un proyecto dedicado al historial y cultura de Nicaragua. Este sitio contiene artículos originales y información sobre ese hermoso país. Es un trabajo de amor y un tributo a la gente de Nicaragua.
Este proyecto es un trabajo de amor y un tributo a la gente de Nicaragua.
Stack de la aplicación
NicaLink corre sobre Next.js con App Router, React y TypeScript. El desarrollo local y next build usan Turbopack. La mayor parte de la interfaz son React Server Components; la navegación, el interruptor de idioma, el tema y otras piezas del shell son componentes cliente pequeños.
Los estilos globales usan Dart Sass: styles.scss compone grillas de layout, header y footer, módulos de UI (formularios, feedback, acordeones, pestañas, tablas y más) y tokens de diseño sincronizados. El SCSS propio del sitio y los tokens de marca viven en src/styles/app/ (por ejemplo local.scss y capas de color del consumidor) para aplicarse encima de los partials sincronizados sin tocar el árbol vendor que entrega la app padre.
Tareas de sincronización automatizadas incorporan componentes de layout y de UI, estilos compartidos e iconos desde el TS Design System, de modo que el shell se mantenga alineado visualmente con otros productos de Tulio Solórzano sin depender de copias manuales. Los componentes de React específicos de NicaLink permanecen en src/components/app/. El middleware de Next.js devuelve redirecciones 308 desde /about y /articles heredadas hacia las rutas canónicas en español (/acerca-de, /articulos), elimina prefijos /es erróneos en URLs en español y envía x-pathname para que el layout raíz pueda fijar el atributo lang del html según la ruta entrante.
TS Design System
Los patrones de layout y UI—Container, Section, SectionHeader, Header, Footer, Main y controles compartidos—se importan de la misma librería de componentes que en otros productos de Tulio Solórzano. Los iconos llegan a src/components/icons con el mismo flujo de sincronización del TS Design System.
Este sitio está implementado con el TS Design System desarrollado por Tulio Solórzano. Ese sistema define tipografía, espaciado, superficies y patrones de interacción para mantener las superficies de producto alineadas, con espacio para copy y rutas específicas de cada app.
Internacionalización y artículos
El español es el idioma por defecto: las URLs públicas usan slugs en español sin prefijo de idioma—por ejemplo /, /acerca-de y /articulos. Las peticiones a /es o rutas que empiezan por /es/ redirigen (308) a la misma ruta sin ese prefijo. El inglés usa /en más slugs en inglés (/en/about, /en/articles y /en/articles/… para el detalle). Los textos del shell y las secciones de página se cargan desde JSON en src/locales/es y src/locales/en. El interruptor de idioma del header mantiene la misma página lógica entre idiomas; las traducciones de artículos comparten un id estable y cada idioma lleva su propio slug en la URL.
El listado y el detalle de artículos leen entradas estructuradas desde articles.json por idioma. El HTML inline en títulos, descripciones y párrafos pasa por una lista permitida de etiquetas: sanitize-html elimina lo no permitido, html-react-parser convierte el resultado en nodos de React y los enlaces internos pueden reescribirse a Link de Next.js, de modo que la app evita dangerouslySetInnerHTML y aun así admite enlaces y énfasis ligero.
Tema, shell y contenido
El paquete sincronizado RootProviders envuelve la app con next-themes (ThemeProvider), ThemeQueryEffect para vistas previas opcionales por query, un proveedor de toasts del kit de UI compartido y restauración manual del scroll. El layout raíz activa suppressHydrationWarning en html y body para que next-themes hidrate sin advertencias.
Header, footer y el shell del documento se renderizan desde template.tsx para seguir las reglas de remount del App Router. Las etiquetas de navegación reutilizan el mismo JSON por idioma que el copy de página. Google Analytics se carga de forma diferida cuando el análisis está activado en el despliegue. manifest.ts y robots.ts siguen las convenciones de metadata del App Router.

