<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software Developer Platform</title><link>https://fundacion-de-valores.github.io/software-development-platform/</link><description>Recent content on Software Developer Platform</description><generator>Hugo</generator><language>es</language><lastBuildDate>Fri, 02 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://fundacion-de-valores.github.io/software-development-platform/index.xml" rel="self" type="application/rss+xml"/><item><title>Conceptos de Testing</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/conceptos-testing/</link><pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/conceptos-testing/</guid><description>Detrás de cada jest.fn() y cada expect() hay conceptos formales con nombres precisos. Esta guía consolida el vocabulario y los principios que dan sentido a todo lo que han estado haciendo en clase.</description></item><item><title>Estándares REST</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/standards-rest/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/standards-rest/</guid><description>Una API que funciona no es lo mismo que una API bien diseñada. Esta guía cubre los principios REST que hacen tu API predecible, consistente y fácil de consumir por cualquier cliente.</description></item><item><title>Hashes — Cómo Guardar Contraseñas de Forma Segura</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/hashes/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/hashes/</guid><description>Qué es una función hash, por qué los hashes rápidos son peligrosos para contraseñas, cómo funciona bcrypt con salt y work factor, y cómo implementar hash y verificación en TypeScript.</description></item><item><title>Prisma Init, Schema y Primer findMany()</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-5/prisma-init-schema-y-primer-findmany/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-5/prisma-init-schema-y-primer-findmany/</guid><description>Guía completa para levantar un proyecto Express + TypeScript + Prisma 7 desde cero: instalación, schema.prisma, tipos de campo, relaciones 1:N, enum, @map/@@map, migraciones y primer Prisma Client.</description></item><item><title>Manejo de Errores de Conexión a la Base de Datos</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/conexion-db-y-manejo-de-errores/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/conexion-db-y-manejo-de-errores/</guid><description>Tipos de errores al conectar con PostgreSQL, cómo capturarlos con pg.Pool, estrategias de reconexión y la diferencia entre errores de conexión y errores de query.</description></item><item><title>Buenas Prácticas al Diseñar un Modelo Entidad-Relación</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/requerimientos-y-diagramas-er/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/requerimientos-y-diagramas-er/</guid><description>Convenciones de nombrado, normalización, errores comunes y checklist para construir modelos ER sólidos antes de escribir una sola línea de SQL.</description></item><item><title>Intro a Node.js, APIs REST y Express</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/intro-node-y-express/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/intro-node-y-express/</guid><description>Setup de un proyecto Node.js desde cero, fundamentos de APIs REST, arquitectura cliente-servidor, formato JSON y primer servidor Express con rutas GET.</description></item><item><title>Fundamentos de TypeScript y Entorno de Trabajo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/fundamentos-y-entorno/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/fundamentos-y-entorno/</guid><description>Introducción al tipado fuerte, arquitectura de compilación y configuración de un proyecto local desde cero.</description></item><item><title>Bienvenido al Material de Aprendizaje</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/primer-material/</link><pubDate>Wed, 26 Nov 2025 10:36:48 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/primer-material/</guid><description>&lt;h1 id="material-de-aprendizaje" class="relative group"&gt;Material de Aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#material-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;Esta sección está dedicada a proporcionar materiales de aprendizaje para desarrolladores de software.&lt;/p&gt;
&lt;h2 id="qué-encontrarás-aquí" class="relative group"&gt;¿Qué encontrarás aquí? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#qu%c3%a9-encontrar%c3%a1s-aqu%c3%ad" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;En esta sección compartiremos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tutoriales de programación&lt;/li&gt;
&lt;li&gt;Recursos de aprendizaje&lt;/li&gt;
&lt;li&gt;Ejemplos de código&lt;/li&gt;
&lt;li&gt;Mejores prácticas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cómo-buscar-material" class="relative group"&gt;¿Cómo buscar material? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#c%c3%b3mo-buscar-material" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Utiliza las etiquetas y categorías para filtrar el contenido según tus necesidades.&lt;/p&gt;</description></item><item><title>Mocking Básico</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/mocking-basico/</link><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/mocking-basico/</guid><description>Un mock bien escrito es la diferencia entre un test que prueba tu código y un test que prueba Prisma. Esta guía cubre todas las formas de crear dobles de prueba en Jest.</description></item><item><title>Comunicación en Tiempo Real</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/real-time-comm/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/real-time-comm/</guid><description>HTTP fue diseñado para request-response. Cuando necesitas que el servidor le hable al cliente sin que el cliente pregunte primero, necesitas otras herramientas.</description></item><item><title>Estructura JWT — JSON Web Tokens</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/estructura-jwt/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/estructura-jwt/</guid><description>Qué es un JWT, cómo se componen sus tres partes (header, payload, firma), qué claims estándar existen, por qué el payload no es secreto aunque no sea legible a simple vista, y cómo se usa un JWT para autenticar peticiones.</description></item><item><title>create(), where, Filtros de Relación e include</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-5/create-where-e-include/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-5/create-where-e-include/</guid><description>Cómo insertar registros con create() sin SELECT extra, consultar con findMany() y findUnique() usando filtros tipados, filtrar por campos de modelos relacionados con mode insensitive, e incluir objetos relacionados en la respuesta con include.</description></item><item><title>Validación de Params y Query Strings</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/validacion-params-y-query-strings/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/validacion-params-y-query-strings/</guid><description>Por qué req.params y req.query necesitan validación propia, sus particularidades como strings puros, y cómo construir esquemas de validación precisos con Zod para cada tipo de entrada.</description></item><item><title>DML II, Operadores de Filtro y Funciones de Agregación</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/dml-insert-filtros-delete/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/dml-insert-filtros-delete/</guid><description>Modificación y eliminación de datos con UPDATE y DELETE, construcción de filtros complejos con operadores lógicos y extracción de estadísticas con funciones de agregación y GROUP BY.</description></item><item><title>¿Por qué PostgreSQL? SQL vs. NoSQL y la Elección del Gestor</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/llaves-tipos-de-datos-y-tablas-pivote/</link><pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/llaves-tipos-de-datos-y-tablas-pivote/</guid><description>Comparación entre bases de datos SQL y NoSQL, cuándo elegir cada paradigma y las razones concretas por las que PostgreSQL es la elección correcta para el stack PERN.</description></item><item><title>Middlewares, Métodos HTTP y CRUD en Memoria</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/middlewares-y-crud-en-memoria/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/middlewares-y-crud-en-memoria/</guid><description>Middleware express.json, métodos POST/PUT/DELETE, códigos de estado HTTP y construcción de un CRUD completo en memoria con manejo de errores.</description></item><item><title>Estructuras de Control, Ciclos y Arrays Fuertemente Tipados</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/estructuras-control-y-arrays/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/estructuras-control-y-arrays/</guid><description>Dominio de estructuras condicionales (if, else, switch, ternarios), bucles iterativos (for, while) y la manipulación segura de arrays primitivos.</description></item><item><title>HTML</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/html/</link><pubDate>Wed, 26 Nov 2025 10:37:48 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/html/</guid><description>&lt;h1 id="html-lenguaje-de-etiquetas-de-hipertexto" class="relative group"&gt;HTML: Lenguaje de etiquetas de hipertexto &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#html-lenguaje-de-etiquetas-de-hipertexto" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt; (Lenguaje de Marcas de Hipertexto, del inglés &lt;em&gt;HyperText Markup Language&lt;/em&gt;) es el componente más básico de la Web. Define el significado y la estructura del contenido web. Además de HTML, generalmente se utilizan otras tecnologías para describir la apariencia/presentación de una página web (&lt;strong&gt;CSS&lt;/strong&gt;) o la funcionalidad/comportamiento (&lt;strong&gt;JavaScript&lt;/strong&gt;).&lt;/p&gt;
&lt;h2 id="qué-es-el-hipertexto" class="relative group"&gt;¿Qué es el &amp;ldquo;Hipertexto&amp;rdquo;? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#qu%c3%a9-es-el-hipertexto" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&amp;ldquo;Hipertexto&amp;rdquo; hace referencia a los enlaces que conectan páginas web entre sí, ya sea dentro de un único sitio web o entre sitios web. Los enlaces son un aspecto fundamental de la Web. Al subir contenido a Internet y vincularlo a las páginas creadas por otras personas, te conviertes en un participante activo en la &lt;strong&gt;«World Wide Web»&lt;/strong&gt; (Red Informática Mundial).&lt;/p&gt;</description></item><item><title>Estrategias QA</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/estrategias-qa/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/estrategias-qa/</guid><description>El testing que han estado escribiendo es una pieza de algo más grande: una estrategia de calidad. Esta guía explica cómo encajan los unit tests, E2E, CI, performance y seguridad en un proceso coherente.</description></item><item><title>Patrón Pub/Sub</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/pub-sub/</link><pubDate>Thu, 23 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/pub-sub/</guid><description>Cuando un módulo necesita notificarle algo a otro sin importarle quién escucha, Pub/Sub es la herramienta correcta. Es la diferencia entre llamar a alguien directamente y publicar un anuncio.</description></item><item><title>Vulnerabilidades en APIs REST</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/vulnerabilidades/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/vulnerabilidades/</guid><description>Las vulnerabilidades más frecuentes en APIs Node.js: SQL injection, IDOR, exposición de datos sensibles, autenticación rota, fuerza bruta, CORS mal configurado y fallos de configuración — con ejemplos del código que introduce cada falla y cómo corregirla.</description></item><item><title>include Anidado, orderBy y Array Vacío vs. null</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-5/include-anidado-orderby-y-null/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-5/include-anidado-orderby-y-null/</guid><description>Cómo traer relaciones de dos y tres niveles con include anidado, ordenar resultados con orderBy por campo propio y de relación, y entender la diferencia entre [] y null en los dos lados de una relación 1:N.</description></item><item><title>Aislar Rutas del Manejo de req/res</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/mvc-y-aislamiento-de-rutas/</link><pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/mvc-y-aislamiento-de-rutas/</guid><description>Por qué las rutas no deben contener lógica de negocio, cómo separar responsabilidades entre router, controller y model, y el beneficio directo en testeabilidad y mantenimiento.</description></item><item><title>Consultas Relacionales: JOINs y Rendimiento</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/consultas-joins/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/consultas-joins/</guid><description>Aprende a conectar datos que viven en tablas separadas usando INNER JOIN, LEFT JOIN y RIGHT JOIN, con ejemplos visuales y buenas prácticas de rendimiento.</description></item><item><title>La Integridad Referencial y la Importancia de los Constraints</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/integridad-referencial-y-constraints/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-1/integridad-referencial-y-constraints/</guid><description>Por qué la integridad referencial no es opcional, cómo cada tipo de constraint protege los datos y las consecuencias reales de omitirlos en producción.</description></item><item><title>Rutas Dinámicas, Express Router y Módulos</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/rutas-dinamicas-y-express-router/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/rutas-dinamicas-y-express-router/</guid><description>req.params, req.query, validaciones de entrada, Express Router, separación de archivos y módulos con TypeScript.</description></item><item><title>Funciones, Arrow Functions, Callbacks y Modelado de Objetos</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/funciones-y-modelado-objetos/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/funciones-y-modelado-objetos/</guid><description>Dominio de funciones con parámetros y retornos tipados, el fenómeno del hoisting, programación funcional con Arrow Functions y Callbacks, y creación de estructuras de objetos mediante Interfaces y Types.</description></item><item><title>Etiquetas De Texto y Multimedia</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/etiquetas-de-texto-y-multimedia/</link><pubDate>Thu, 04 Dec 2025 14:49:29 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/etiquetas-de-texto-y-multimedia/</guid><description>&lt;h1 id="etiquetas-de-texto-y-multimedia-en-html" class="relative group"&gt;Etiquetas de Texto y Multimedia en HTML &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#etiquetas-de-texto-y-multimedia-en-html" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase, serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilizar correctamente las etiquetas semánticas de texto en HTML5 para estructurar contenido&lt;/li&gt;
&lt;li&gt;Insertar y configurar elementos multimedia (imágenes, audio y video) con sus atributos apropiados&lt;/li&gt;
&lt;li&gt;Aplicar técnicas de accesibilidad en contenido textual y multimedia&lt;/li&gt;
&lt;li&gt;Optimizar la carga de recursos multimedia para mejorar el rendimiento web&lt;/li&gt;
&lt;li&gt;Diferenciar entre etiquetas de formato visual y etiquetas semánticas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="por-qué-es-importante-dominar-estas-etiquetas" class="relative group"&gt;¿Por qué es importante dominar estas etiquetas? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#por-qu%c3%a9-es-importante-dominar-estas-etiquetas" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;El contenido es el corazón de cualquier sitio web. Las etiquetas de texto y multimedia son las herramientas fundamentales que te permiten comunicar información de manera efectiva a tus usuarios.&lt;/p&gt;</description></item><item><title>Coverage</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/coverage/</link><pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/coverage/</guid><description>El 85% de coverage en el reporte de Jest no significa que el 85% de tu código está bien probado. Esta guía explica qué mide exactamente cada métrica, cómo interpretarla, y por qué el número puede mentir.</description></item><item><title>Casos de Uso</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/casos-de-uso/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/casos-de-uso/</guid><description>Un Service que hace demasiado es el síntoma. Un Caso de Uso bien delimitado es el remedio. Esta guía explica qué son, por qué existen y cómo implementarlos sin sobre-ingeniería.</description></item><item><title>Guards en NestJS</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/guards/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/guards/</guid><description>Qué son los Guards, cómo se ubican en el ciclo de vida de una petición, cómo crear un Guard de autenticación JWT y uno de roles, cómo aplicarlos por método, controlador o de forma global, y la diferencia entre Guards y Middleware.</description></item><item><title>update(), Errores P2025, Fechas, groupBy y $queryRaw</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-5/update-errores-fecha-groupby-y-queryraw/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-5/update-errores-fecha-groupby-y-queryraw/</guid><description>Actualización parcial con update() sin merge manual, manejo tipado de errores Prisma con PrismaClientKnownRequestError, filtros de rango de fecha con gte/lte, agregaciones con groupBy y _count, y consultas SQL arbitrarias con $queryRaw.</description></item><item><title>Manejo de Errores de Constraint en la Base de Datos</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/errores-de-constraint-db/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/errores-de-constraint-db/</guid><description>Cómo identificar, capturar y traducir violaciones de constraints de PostgreSQL en respuestas HTTP útiles para el cliente, desde el código 23505 hasta errores de FK.</description></item><item><title>OpenAPI, Swagger y Validación Básica</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/swagger-y-validacion-basica/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/swagger-y-validacion-basica/</guid><description>Documentación automática de APIs con swagger-ui-express y swagger-autogen, anotaciones en rutas y validación básica de entradas con patrones reutilizables.</description></item><item><title>Desestructuración y Métodos Funcionales de Arrays</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/destructuracion-y-metodos-funcionales/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/destructuracion-y-metodos-funcionales/</guid><description>Extracción eficiente de datos mediante desestructuración de objetos y arrays, y manipulación avanzada de datos usando métodos declarativos esenciales.</description></item><item><title>Propiedades Básicas Css</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/propiedades-basicas-css/</link><pubDate>Fri, 05 Dec 2025 07:51:32 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/propiedades-basicas-css/</guid><description>&lt;h1 id="propiedades-básicas-de-css-background-color-font-y-text" class="relative group"&gt;Propiedades Básicas de CSS: Background, Color, Font y Text &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#propiedades-b%c3%a1sicas-de-css-background-color-font-y-text" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase, serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aplicar propiedades de fondo (background) para crear diseños visuales atractivos&lt;/li&gt;
&lt;li&gt;Utilizar correctamente las diferentes formas de especificar colores en CSS&lt;/li&gt;
&lt;li&gt;Configurar tipografías personalizadas con la familia de propiedades &lt;code&gt;font&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Controlar la apariencia del texto mediante propiedades de &lt;code&gt;text&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Combinar estas propiedades para crear interfaces web profesionales y legibles&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;¿Alguna vez te has preguntado cómo los sitios web logran esa apariencia pulida y profesional? La respuesta está en el dominio de las propiedades básicas de CSS. Estas cuatro familias de propiedades —background, color, font y text— son los pilares fundamentales del diseño web.&lt;/p&gt;</description></item><item><title>Pipelines CI</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/pipelines-ci/</link><pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-8/pipelines-ci/</guid><description>El CI que corrió pnpm test en cada PR es solo el comienzo. Esta guía explica cómo construir un pipeline completo: lint, types, tests, coverage, build, servicios de DB, artifacts y deploy.</description></item><item><title>Invalidación</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/invalidacion/</link><pubDate>Sat, 25 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-7/invalidacion/</guid><description>Phil Karlton dijo que solo hay dos cosas difíciles en ciencias de la computación: invalidar caché y nombrar cosas. Esta guía explica por qué tiene razón y cómo resolver ambas.</description></item><item><title>Políticas CORS</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/politicas-cors/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-6/politicas-cors/</guid><description>Cómo funciona la política de mismo origen del navegador, qué headers controlan CORS, la diferencia entre peticiones simples y preflighted, cómo configurar CORS en Express y NestJS, y por qué origin &amp;lsquo;*&amp;rsquo; es incompatible con cookies y credenciales.</description></item><item><title>Consultas Dinámicas Seguras con WHERE</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/consultas-dinamicas-seguras/</link><pubDate>Sat, 27 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-4/consultas-dinamicas-seguras/</guid><description>Cómo construir cláusulas WHERE que cambian según los filtros del cliente sin abrir la puerta a SQL injection, usando parámetros posicionales y arrays de condiciones.</description></item><item><title>Variables de Entorno, CORS y Seguridad Básica</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/variables-de-entorno-y-cors/</link><pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-3/variables-de-entorno-y-cors/</guid><description>Variables de entorno nativas con &amp;ndash;env-file, CORS middleware en Express y fundamentos de seguridad básica para APIs en producción.</description></item><item><title>Programación Asíncrona, Promesas y Async/Await</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/asincronia-promesas-async-await/</link><pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/ts/semana-2/asincronia-promesas-async-await/</guid><description>Comprensión del modelo de ejecución no bloqueante de JavaScript, gestión de flujos de datos asíncronos mediante Promesas y Async/Await, y control robusto de excepciones con try/catch.</description></item><item><title>Lunes — Equipo, Modelo de Datos e Identidad de Usuarios</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/lunes/</link><pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/lunes/</guid><description>Organiza al equipo y el repositorio, diseña el modelo relacional completo del Help Desk y deja funcionando el registro, el login con JWT y el perfil del usuario autenticado.</description></item><item><title>01 — Axios, Peticiones GET y CORS</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/01-axios-api-cors/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/01-axios-api-cors/</guid><description>Por qué Axios ahorra código repetido frente a fetch, cómo funcionan los interceptores por dentro, y por qué CORS es una restricción del navegador — no del servidor. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>01 — Despliegue en Vercel y Variables de Entorno</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/01-vercel-deploy/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/01-vercel-deploy/</guid><description>Desplegamos una SPA en Vercel con CI/CD automático desde GitHub, entendemos por qué las variables de entorno de Vite se resuelven en build-time (no en runtime), y por qué un error de render puede tumbar toda la app si no hay un Error Boundary de nivel superior.</description></item><item><title>01 — Flujo de Login y JWT en React</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/01-auth-jwt-login/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/01-auth-jwt-login/</guid><description>Cómo viaja un JWT desde el login hasta cada petición protegida, por qué persist de Zustand no reemplaza tu criterio (solo automatiza guardar en localStorage), y por qué un store de Zustand necesita getState() cuando lo usas fuera de un componente. Ejemplo de práctica con el staff de una tienda.</description></item><item><title>01 — Intro React, Vite, JSX y Estado Básico</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/01-react-vite-jsx/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/01-react-vite-jsx/</guid><description>Qué es React, cómo nos ayuda y cómo piensa internamente (Virtual DOM, reconciliación). Creamos el primer proyecto con Vite y TypeScript, escribimos componentes funcionales con JSX, definimos cuándo conviene crear un componente nuevo, tipamos props con interfaces y manejamos estado local con useState — con ejercicios resueltos paso a paso sobre un ejemplo de práctica.</description></item><item><title>Día 1 — Dashboard con MetricCards</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-1/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-1/</guid><description>Configura el proyecto, crea los primeros componentes React tipados con TypeScript y construye la página Dashboard que será la pantalla principal de la SPA.</description></item><item><title>Día 1 — Datos Reales en el Dashboard</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-1/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-1/</guid><description>Configura Axios, habilita CORS en el backend y reemplaza los datos mock del MP1 por datos reales de la API. El dashboard muestra métricas cargadas desde el servidor.</description></item><item><title>Día 1 — Deploy en Vercel</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-1/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-1/</guid><description>Despliegas tu versión del MP3 en Vercel con variables de entorno correctas y el rewrite para SPA. Al final del día, tu Clínica está en producción.</description></item><item><title>Día 1 — Login Funcional con JWT</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-1/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-1/</guid><description>Implementas el flujo de autenticación: PaginaLogin con RHF + Zod, authStore con Zustand persist y el interceptor de Axios para el token. Al terminar el día, la app tiene login real.</description></item><item><title>Lectura Guiada — Anatomía de un JWT</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/01-lectura-jwt/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/01-lectura-jwt/</guid><description>La estructura header.payload.signature de un JWT, la diferencia entre decodificar y verificar, y por qué el payload nunca debe llevar información sensible.</description></item><item><title>Lunes — Identidad por Rol y Catálogo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/lunes/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/lunes/</guid><description>Levanta el proyecto desde cero, construye el login y registro contra tu propia API de POS &amp;amp; E-commerce, y deja el catálogo administrable desde el panel de staff y navegable en la vitrina pública.</description></item><item><title>Lunes — Registro Público, Aprobación e Identidad por Rol</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/lunes/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/lunes/</guid><description>Levanta el proyecto desde cero, construye el registro público de postulantes, la aprobación desde el panel de Recepción y el login de los 4 roles contra tu propia API de SGAF.</description></item><item><title>Vocabulario Cloud y Deploy</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/01-vocab-cloud/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/01-vocab-cloud/</guid><description>Glosario de términos de cloud y despliegue: CDN, edge, build, hosting estático, variables de entorno, DNS, SSL/HTTPS y serverless. Lee esto antes de la clase de despliegue en Vercel.</description></item><item><title>Vocabulario Fetch</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/01-vocabulario-fetch/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/01-vocabulario-fetch/</guid><description>Glosario de términos esenciales de peticiones HTTP asíncronas: fetch, Promesas, Axios e interceptores. Lee esto antes de la primera clase de la semana.</description></item><item><title>Vocabulario UI</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/01-vocabulario-ui/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/01-vocabulario-ui/</guid><description>Glosario de términos esenciales de React, el DOM y la arquitectura de interfaces. Lee esto antes de la primera clase de la semana.</description></item><item><title>Lunes — Módulo de Citas y Comunicación entre Módulos</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/lunes/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/lunes/</guid><description>Agrega el módulo de Citas relacionado con Pacientes, inyectando PacientesService dentro de CitasService para validar que el paciente existe antes de agendar.</description></item><item><title>Viernes — Modelo de Datos y Arquitectura</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/viernes/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/viernes/</guid><description>Traduce el caso de negocio del sistema híbrido POS + E-commerce en un modelo relacional propio de al menos 9 tablas, deja tu schema.prisma migrado y siembra los datos mínimos para arrancar el proyecto.</description></item><item><title>Viernes — Modelo de Datos y Arquitectura</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/viernes/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/viernes/</guid><description>Traduce el caso de negocio de SGAF en un modelo relacional propio de al menos 9 tablas, deja tu schema.prisma migrado y siembra los datos mínimos para arrancar el proyecto.</description></item><item><title>Lunes — Setup de NestJS y Módulos de Pacientes y Médicos</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/lunes/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/lunes/</guid><description>Crea un proyecto NestJS, reutiliza el schema.prisma de la Semana 5 e inicializa los módulos de Pacientes y Médicos con un PrismaService inyectable.</description></item><item><title>Lunes — Levantamiento de Requerimientos y Setup de Prisma</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/lunes/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/lunes/</guid><description>Abstrae el caso de negocio de la clínica en entidades, atributos y relaciones por tu cuenta, inicializa Prisma y traduce tu propio modelo a schema.prisma.</description></item><item><title>Lunes S5 — Prisma Init, Schema, Migraciones y Primer findMany()</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-5/lunes/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-5/lunes/</guid><description>El maestro migra academia-api de CommonJS a ESM, inicializa Prisma 7, define el schema con modelos tipados, enum, @map/@@map y relación 1:N entre Instructor y Curso, ejecuta la migración inicial, genera el cliente y hace el primer findMany().</description></item><item><title>Lunes — Repositorio Base y Conexión a PostgreSQL</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/lunes/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/lunes/</guid><description>Clona el starter template, instala el driver pg y escribe tu primer endpoint que consulta la tabla products directamente desde Node.js.</description></item><item><title>Lunes S4 — pg.Pool, .env y Primeras Queries Asíncronas</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/lunes/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/lunes/</guid><description>El maestro instala pg, configura el Pool con credenciales desde .env, crea la base de datos y la tabla cursos, verifica la conexión antes de arrancar el servidor y migra los tres endpoints GET del array en memoria a consultas SQL reales con parámetros posicionales.</description></item><item><title>Lunes S1 — Requerimientos, Tipos de Relaciones y Primeras Queries SELECT</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/lunes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/lunes/</guid><description>El maestro guía al grupo desde un problema de negocio verbal hasta las primeras consultas SELECT, pasando por la identificación de entidades, los tres tipos de relaciones y la diagramación visual antes de tocar pgAdmin.</description></item><item><title>Lunes S2 — Intro TypeScript, Variables, Tipos Primitivos y Operadores</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/lunes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/lunes/</guid><description>El maestro instala la cadena typescript + ts-node + @types/node, muestra en vivo cómo tsc compila un archivo .ts a .js (y qué desaparece), luego trabaja variables, tipos primitivos y operadores dentro del contexto de la Academia TechPath.</description></item><item><title>Lunes S3 — Conceptos API REST, Setup Node.js + Express y Primeras Rutas GET</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/lunes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/lunes/</guid><description>El maestro explica el modelo Cliente-Servidor y el formato JSON con un diagrama en pizarrón, monta en vivo el proyecto Node.js + TypeScript + Express desde cero, crea un array de cursos en memoria y expone tres rutas GET que el grupo prueba en Thunder Client.</description></item><item><title>Lunes — Levantamiento de Requerimientos y Entidades</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/lunes/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/lunes/</guid><description>Abstrae el caso de negocio &amp;lsquo;El Ricon del dabor&amp;rsquo; en entidades, atributos y relaciones, y documenta el análisis en un archivo Markdown.</description></item><item><title>Lunes — Setup del Servidor y Primer Endpoint</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/lunes/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/lunes/</guid><description>Inicializa el proyecto con Node.js, Express y TypeScript, y crea el primer endpoint GET que confirma que el servidor está en línea.</description></item><item><title>Día 1 — Setup del Entorno y Lógica Computacional</title><link>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-1/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-1/</guid><description>Prepara tu máquina con PostgreSQL, Git y Node.js, y da tus primeros pasos en lógica computacional con variables y Raptor.</description></item><item><title>Lunes — Fundamentos y Setup Inicial</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/lunes/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/lunes/</guid><description>Configura el proyecto desde cero, declara las primeras variables con tipos explícitos e imprime un banner de bienvenida.</description></item><item><title>Martes — Roles, Guards y Catálogo de Categorías</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/martes/</link><pubDate>Tue, 29 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/martes/</guid><description>Protege la API según el rol del usuario, habilita el listado de usuarios filtrable por rol y deja operativo el catálogo de categorías: de solo lectura para empleados y administrable por el personal interno.</description></item><item><title>02 — Carga Diferida, Suspense y Memoización</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/02-lazy-suspense-memoizacion/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/02-lazy-suspense-memoizacion/</guid><description>Por qué el código de una app crece más rápido que su uso real, y cómo React.lazy + Suspense evitan descargar código que el usuario no visitó. Por qué useMemo y useCallback existen específicamente por la comparación por referencia que ya viste en la semana 1. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>02 — Generación UI con AI, Refactor y Tailwind CSS</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/02-ui-con-ai-stitch/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/02-ui-con-ai-stitch/</guid><description>Por qué las herramientas de IA generan UI de una forma predecible (y predeciblemente problemática), y cómo refactorizar ese código en componentes limpios con TypeScript y Tailwind. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>02 — Mutaciones UI: POST, PUT, DELETE y UI Optimista</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/02-mutaciones-ui/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/02-mutaciones-ui/</guid><description>La diferencia real entre leer y escribir datos, por qué separar los servicios de la UI, y qué hace exactamente useOptimistic por dentro — no es magia, es guardar el estado esperado antes de confirmar el servidor. Ejemplo de práctica con pedidos de una tienda.</description></item><item><title>02 — Rutas Protegidas y Axios Interceptors con Refresh</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/02-rutas-protegidas/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/02-rutas-protegidas/</guid><description>Por qué un Guard es solo un componente que decide entre renderizar el Outlet o redirigir, y qué hace por dentro un interceptor de refresh token para renovar la sesión sin que el usuario lo note. Ejemplo de práctica con el staff de una tienda.</description></item><item><title>Access Token vs Refresh Token</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/02-tokens/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/02-tokens/</guid><description>Por qué el access token tiene vida corta, y cómo un interceptor de Axios renueva la sesión automáticamente al recibir un 401, sin que el usuario lo note.</description></item><item><title>Checklist de Deploy</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/02-checklist-deploy/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/02-checklist-deploy/</guid><description>Checklist de referencia rápida antes de cualquier deploy a producción: build sin errores, variables de entorno, rewrite de SPA, y limpieza de código de debug. Exactamente lo que vas a necesitar en tu semana de Proyecto Final.</description></item><item><title>Día 2 — CRUD Real: POST, PUT, DELETE</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-2/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-2/</guid><description>Conectas las operaciones de escritura al backend real. Crear pacientes con POST, cambiar estado de citas con UI optimista (useOptimistic) y eliminar con modal de confirmación.</description></item><item><title>Día 2 — Lazy Loading y Dashboard Analítico</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-2/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-2/</guid><description>Conviertes todas las páginas secundarias a React.lazy con Suspense, y agregas un Dashboard Analítico optimizado con useMemo para los cálculos de métricas.</description></item><item><title>Día 2 — Página de Pacientes con AI y Tailwind</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-2/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-2/</guid><description>Genera la página de pacientes con Stitch AI, analiza el código, la refactorizas en componentes tipados y la estilizas con Tailwind. Esta página será la ruta /pacientes del proyecto.</description></item><item><title>Día 2 — Rutas Protegidas por Rol</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-2/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-2/</guid><description>Implementas el componente RutaProtegida que redirige al login si no hay sesión activa, y protege rutas específicas por rol de usuario.</description></item><item><title>Lectura Guiada — Cómo Funcionan las Promesas</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/02-lectura-promises/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/02-lectura-promises/</guid><description>Los 3 estados de una Promesa, el encadenamiento con .then, y por qué async/await no es más que azúcar sintáctico sobre el mismo mecanismo.</description></item><item><title>Martes — Estructura Académica y Motor de Matriculación</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/martes/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/martes/</guid><description>Construye la administración de periodos, materias, grupos y horarios, y la pantalla de matriculación del estudiante con feedback específico para cada una de las 4 reglas de negocio.</description></item><item><title>Martes — Punto de Venta (POS)</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/martes/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/martes/</guid><description>Construye el módulo de venta de mostrador desde la interfaz: carrito interno, cobro, comprobante y manejo claro del rechazo por stock insuficiente.</description></item><item><title>Prompting UI</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/02-prompting-ui/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/02-prompting-ui/</guid><description>Cómo escribir prompts efectivos para herramientas de IA que generan interfaces. La diferencia entre un prompt genérico y uno estructurado es la diferencia entre código aprovechable y código basura.</description></item><item><title>Martes — Documentación Completa con Swagger</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/martes/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/martes/</guid><description>Documenta toda la API en /api/docs con @nestjs/swagger, incluyendo los DTOs con @ApiProperty() y el esquema de seguridad Bearer para las rutas protegidas.</description></item><item><title>Lunes — Identidad, Autenticación y Esqueleto de la API</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/lunes/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/lunes/</guid><description>Levanta el proyecto NestJS, habilita el registro público de postulantes con aprobación ligada a pago, conecta Passport-JWT para los 4 roles de SGAF y protege cada módulo según corresponda.</description></item><item><title>Lunes — Identidad, Roles y Catálogo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/lunes/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/lunes/</guid><description>Conecta Passport-JWT para los 3 roles del negocio y deja el catálogo de productos e inventario funcionando con CRUD completo.</description></item><item><title>Martes — CRUD completo de Pacientes y Médicos con PrismaService</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/martes/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/martes/</guid><description>Completa el CRUD de pacientes y médicos usando decoradores de NestJS y el PrismaService inyectado, replicando la lógica que ya construiste en Express durante la Semana 5.</description></item><item><title>Martes — CRUD de Pacientes y Médicos con Prisma Client</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/martes/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/martes/</guid><description>Organiza tu proyecto en capas MVC sobre Prisma Client, valida datos con Zod y construye el alta de pacientes y la búsqueda de médicos por especialidad.</description></item><item><title>Martes S5 — create(), findMany()/findUnique() con where, Filtros de Relación e include</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-5/martes/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-5/martes/</guid><description>El maestro migra la capa Model de academia-api de pool.query() a Prisma Client: reemplaza las lecturas con findMany()/findUnique(), agrega filtros dinámicos con where, filtra por campos del modelo relacionado, incluye el Instructor en las respuestas con include, y sustituye el INSERT+RETURNING por create().</description></item><item><title>Martes — Arquitectura Limpia con el Patrón MVC</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/martes/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/martes/</guid><description>Refactoriza el endpoint del lunes al patrón MVC y luego extiende la API con CRUD completo: GET por id, POST y PUT para productos.</description></item><item><title>Miércoles — Middlewares de Validación con Zod</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/miercoles/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/miercoles/</guid><description>Instala Zod, define schemas de validación y crea middlewares que bloquean requests inválidos antes de que lleguen al controlador.</description></item><item><title>Martes S4 — Arquitectura MVC: Controllers y Models</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/martes/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/martes/</guid><description>El maestro explica la arquitectura MVC en el contexto de Express, reestructura las carpetas del proyecto y migra la lógica de las rutas GET a sus capas correctas: las queries SQL van al Model, la lógica de request/response va al Controller, y el archivo de rutas queda como un mapa delgado de URL→handler.</description></item><item><title>Martes S1 — Llaves, Tipos de Datos, Normalización y Tablas Pivote N:M</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/martes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/martes/</guid><description>El maestro refuerza el sistema de llaves, presenta los tipos de datos más comunes, introduce la normalización con un ejemplo concreto y construye la primera relación N:M mediante una tabla pivote — todo en SQL puro desde pgAdmin.</description></item><item><title>Martes S2 — Estructuras de Control, Ciclos y Arrays</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/martes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/martes/</guid><description>El maestro construye un mini-sistema de calificaciones con if/else, switch y ternario, luego acumula totales con for y while, y termina creando y mutando arrays tipados con push y pop.</description></item><item><title>Martes S3 — Middlewares, CRUD en Memoria y try/catch en Rutas</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/martes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/martes/</guid><description>El maestro muestra el bug de req.body sin express.json, conecta la interfaz Curso con el esquema PostgreSQL de la semana 1 (Migración S1), y construye el CRUD completo con POST, PUT y DELETE sobre el array en memoria, envolviendo cada ruta en try/catch.</description></item><item><title>Martes — CRUD en Memoria y Middlewares HTTP</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/martes/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/martes/</guid><description>Implementa los cuatro verbos HTTP sobre un arreglo en memoria, aplica express.json() y responde con los códigos de estado correctos.</description></item><item><title>Martes — Modelo Relacional y Diagrama ER</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/martes/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/martes/</guid><description>Resuelve la relación Muchos a Muchos con una tabla pivote, traduce las entidades a código DBML y genera el diagrama visual en dbdiagram.io.</description></item><item><title>Día 2 — Entradas, Tipos de Datos y Concatenación</title><link>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-2/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-2/</guid><description>Aprende a darle &amp;lsquo;oídos&amp;rsquo; a tu programa con el bloque Input, la diferencia crítica entre Strings y números, y cómo armar frases dinámicas con concatenación.</description></item><item><title>Martes — Control de Flujo y Colecciones</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/martes/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/martes/</guid><description>Implementa el menú interactivo del gestor con un ciclo while, manejo de opciones con if/else y un arreglo tipado para almacenar tareas.</description></item><item><title>Eventos en React</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/eventos-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/eventos-react/</guid><description>&lt;p&gt;Los eventos en React funcionan igual que en HTML, pero con dos reglas que debes memorizar.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="las-dos-reglas-de-oro" class="relative group"&gt;Las Dos Reglas de Oro &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#las-dos-reglas-de-oro" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;HTML (viejo)&lt;/th&gt;
 &lt;th&gt;React (nuevo)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;onclick&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;onClick&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;onchange&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;onChange&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;onsubmit&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;onSubmit&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Regla 1 camelCase:&lt;/strong&gt; La segunda palabra va en mayúscula.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regla 2 Función, no texto:&lt;/strong&gt; Pasas la función entre &lt;code&gt;{}&lt;/code&gt;, sin ejecutarla.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// HTML tradicional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onclick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;saludar()&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Clic&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// React
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Clic&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; &lt;code&gt;onClick={saludar}&lt;/code&gt; &lt;code&gt;onClick={saludar()}&lt;/code&gt;. Con paréntesis la función se ejecuta al cargar, ¡no al hacer clic!&lt;/p&gt;</description></item><item><title>Estado en React (useState)</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/estados-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/estados-react/</guid><description>&lt;p&gt;Los componentes de React tienen &amp;ldquo;memoria&amp;rdquo;. A esta memoria le llamamos &lt;strong&gt;Estado (State)&lt;/strong&gt;. Sin estado, la pantalla nunca cambia aunque los datos sí lo hagan.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-variables-normales-no-funcionan" class="relative group"&gt;El problema: variables normales no funcionan &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#el-problema-variables-normales-no-funcionan" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;ContadorRoto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sumar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;El número ahora es:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// cambia en consola...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Número&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* ...pero siempre muestra 0 */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;sumar&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Sumar&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;React dibuja el componente una vez y, &lt;strong&gt;a menos que le avisemos&lt;/strong&gt;, no vuelve a actualizar la pantalla.&lt;/p&gt;</description></item><item><title>Consolidación y Buenas Prácticas en React</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/consolidacion-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/consolidacion-react/</guid><description>&lt;h1 id="consolidación-flujo-de-datos-y-buenas-prácticas" class="relative group"&gt;Consolidación, Flujo de Datos y Buenas Prácticas &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#consolidaci%c3%b3n-flujo-de-datos-y-buenas-pr%c3%a1cticas" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;Hoy unimos todas las piezas vistas y aprendemos a escribir código como los profesionales.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="parte-1--repaso-de-los-4-pilares" class="relative group"&gt;Parte 1 Repaso de los 4 Pilares &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#parte-1--repaso-de-los-4-pilares" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Concepto&lt;/th&gt;
 &lt;th&gt;En una frase&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;React&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Dividimos la UI en piezas pequeñas y reutilizables&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Componentes&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Funciones en &lt;code&gt;PascalCase&lt;/code&gt; que retornan JSX&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Eventos&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;camelCase + función sin ejecutar: &lt;code&gt;onClick={saludar}&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;useState&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Da una variable para leer y una función para actualizar&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="parte-2--flujo-de-datos-unidireccional" class="relative group"&gt;Parte 2 Flujo de Datos Unidireccional &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#parte-2--flujo-de-datos-unidireccional" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;En React los datos &lt;strong&gt;solo viajan hacia abajo&lt;/strong&gt; (Padre Hijo) a través de &lt;strong&gt;Props&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Efectos Secundarios con useEffect</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/use-effect-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/use-effect-react/</guid><description>&lt;h1 id="dominando-useeffect--efectos-secundarios" class="relative group"&gt;Dominando &lt;code&gt;useEffect&lt;/code&gt; Efectos Secundarios &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#dominando-useeffect--efectos-secundarios" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;Nuestros componentes hacen tres cosas: reciben datos, procesan y muestran JSX. Pero a veces necesitan &amp;ldquo;salir&amp;rdquo; de ese flujo: traer datos de una API, cambiar el título del navegador, iniciar un temporizador. A esas acciones las llamamos &lt;strong&gt;Efectos Secundarios&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="anatomía-de-useeffect" class="relative group"&gt;Anatomía de &lt;code&gt;useEffect&lt;/code&gt; &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#anatom%c3%ada-de-useeffect" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Código del efecto (lo que quieres hacer)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt; &lt;span class="c1"&gt;// Arreglo de dependencias (cuándo ejecutarlo)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="las-3-reglas-de-ejecución" class="relative group"&gt;Las 3 Reglas de Ejecución &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#las-3-reglas-de-ejecuci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Escenario&lt;/th&gt;
 &lt;th&gt;Cuándo se ejecuta&lt;/th&gt;
 &lt;th&gt;Uso típico&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Sin arreglo&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;En &lt;strong&gt;cada&lt;/strong&gt; re-render&lt;/td&gt;
 &lt;td&gt;Casi nunca puede causar bucles infinitos&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Arreglo vacío &lt;code&gt;[]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Solo &lt;strong&gt;una vez&lt;/strong&gt; al montar&lt;/td&gt;
 &lt;td&gt;Fetch inicial de datos de una API&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Con variables &lt;code&gt;[var]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Al montar + cuando &lt;code&gt;var&lt;/code&gt; cambia&lt;/td&gt;
 &lt;td&gt;Reaccionar a un filtro, búsqueda, etc.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Escenario B fetch al cargar (el más común)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Solo al montar el componente&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Escenario C reacciona a un estado específico
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`Contador cambió a: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;contador&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;contador&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// ignora otros estados
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="ejemplo-real-consumir-una-api" class="relative group"&gt;Ejemplo Real: Consumir una API &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#ejemplo-real-consumir-una-api" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;ListaUsuarios&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;usuarios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsuarios&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://jsonplaceholder.typicode.com/users&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;datos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setUsuarios&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;datos&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt; &lt;span class="c1"&gt;// [] = solo un fetch al cargar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;usuarios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;{&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;))}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="código-de-limpieza-cleanup" class="relative group"&gt;Código de Limpieza (Cleanup) &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#c%c3%b3digo-de-limpieza-cleanup" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Si tu efecto inicia algo que corre en el fondo (temporizadores, suscripciones), debes limpiarlo cuando el componente desaparezca si no, causará errores de memoria.&lt;/p&gt;</description></item><item><title>Peticiones HTTP y Conexión con el Backend</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/peticiones-http-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/peticiones-http-react/</guid><description>&lt;h1 id="peticiones-http--conectando-react-con-el-backend" class="relative group"&gt;Peticiones HTTP Conectando React con el Backend &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#peticiones-http--conectando-react-con-el-backend" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;En una app real, React necesita hablar con un servidor para pedir, guardar, actualizar o borrar datos. Lo hacemos con &lt;strong&gt;Peticiones HTTP&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-diccionario-http-crud" class="relative group"&gt;El Diccionario HTTP (CRUD) &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#el-diccionario-http-crud" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Verbo&lt;/th&gt;
 &lt;th&gt;Acción&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Leer datos&lt;/td&gt;
 &lt;td&gt;Traer lista de productos&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Crear datos nuevos&lt;/td&gt;
 &lt;td&gt;Registrar un usuario&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;PUT / PATCH&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Actualizar datos&lt;/td&gt;
 &lt;td&gt;Cambiar foto de perfil&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Borrar datos&lt;/td&gt;
 &lt;td&gt;Eliminar un artículo del carrito&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="get--useeffect--la-pareja-ideal" class="relative group"&gt;GET + &lt;code&gt;useEffect&lt;/code&gt; La Pareja Ideal &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#get--useeffect--la-pareja-ideal" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Cuando quieres mostrar datos al cargar la página, el GET va dentro de &lt;code&gt;useEffect&lt;/code&gt; con &lt;code&gt;[]&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Miércoles — Ciclo de Vida de los Tickets y Comentarios</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/miercoles/</link><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/miercoles/</guid><description>Construye el núcleo transaccional del Help Desk: tickets con estados, asignación a agentes y visibilidad por rol, más un historial de comentarios por ticket con autor y fecha registrados automáticamente.</description></item><item><title>03 — Carga de Archivos y Previsualización Local</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/03-file-upload/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/03-file-upload/</guid><description>Enviamos archivos al backend con FormData y multipart/form-data, mostramos una previsualización local antes de subir usando URL.createObjectURL, y conectamos con el endpoint de upload del backend.</description></item><item><title>03 — Custom Hooks: Extraer Lógica Reutilizable</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/03-custom-hooks/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/03-custom-hooks/</guid><description>Qué hace que una función sea un &amp;lsquo;hook&amp;rsquo; de verdad (no solo el nombre), por qué extraer lógica con estado en un Custom Hook separa &amp;lsquo;qué hace la pantalla&amp;rsquo; de &amp;lsquo;cómo se ve&amp;rsquo;, y cómo componer varios hooks dentro de uno propio. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>03 — Eventos del DOM, Controlled Inputs e Inmutabilidad</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/03-eventos-dom-estado/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/03-eventos-dom-estado/</guid><description>Por qué React envuelve los eventos nativos del DOM, qué significa realmente que un input sea &amp;lsquo;controlado&amp;rsquo;, y por qué React exige inmutabilidad para detectar cambios en arrays y objetos. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>03 — Gestión de Estado Global con Zustand</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/03-zustand-estado-global/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/03-zustand-estado-global/</guid><description>Por qué el prop drilling se vuelve insostenible en apps reales, por qué Context API no es la respuesta para estado que cambia seguido, y cómo un selector de Zustand evita re-renders innecesarios comparando referencias — la misma idea de la semana 1, aplicada a estado global. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>Día 3 — Custom Hooks: usePacientes y useCitas</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-3/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-3/</guid><description>Extraes la lógica de datos de Pacientes y Citas de tus páginas hacia Custom Hooks reutilizables, dejando los componentes enfocados solo en la vista.</description></item><item><title>Día 3 — Formulario de Perfil con Foto</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-3/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-3/</guid><description>El usuario puede actualizar sus datos y subir una foto de perfil con previsualización inmediata antes de enviar. Usa FormData y multipart/form-data para el upload.</description></item><item><title>Día 3 — Migrar Estado Local a Zustand</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-3/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-3/</guid><description>Eliminas el prop drilling de la SPA migrando el estado de pacientes y citas a stores de Zustand con acciones asíncronas, devtools configurado y selectores correctos.</description></item><item><title>Día 3 — Pacientes Interactivos: Filtros y CRUD en Estado</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-3/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-3/</guid><description>La lista de pacientes del día 2 ahora reacciona a las acciones del usuario: filtros combinados, agregar, cambiar estado y eliminar — todo con inmutabilidad garantizada y event handlers tipados.</description></item><item><title>Guards y Rutas Protegidas — Patrones</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/03-guards-rutas/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/03-guards-rutas/</guid><description>Qué es un Guard en una SPA, por qué es &amp;lsquo;solo un if&amp;rsquo; que decide entre Outlet y Navigate, y la diferencia entre revisar sesión y revisar rol.</description></item><item><title>Lectura Guiada — lazy y Suspense en react.dev</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/03-lectura-ui/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/03-lectura-ui/</guid><description>Lectura guiada de la documentación oficial de React sobre lazy y Suspense: qué problema resuelve el code splitting y cómo leer la referencia oficial en react.dev. Prepara la clase de martes.</description></item><item><title>Miércoles — Aula Virtual</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/miercoles/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/miercoles/</guid><description>Construye el flujo completo del aula virtual: un profesor publica una asignación, un estudiante entrega y el profesor califica, todo desde la interfaz.</description></item><item><title>Miércoles — Tienda en Línea y Cola de Órdenes</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/miercoles/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/miercoles/</guid><description>Construye el checkout del cliente web, verifica la sincronización de inventario entre canales desde la interfaz, y la cola de órdenes con sus estados logísticos.</description></item><item><title>Tailwind — Patrones de Componentes UI</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/03-tailwind-patrones/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/03-tailwind-patrones/</guid><description>Recetas de Tailwind CSS para los componentes de UI más comunes: botones, cards, badges, alerts y modales. Combina utilidades para construir piezas reutilizables sin escribir CSS.</description></item><item><title>Thinking React — La Filosofía de React</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/03-thinking-react/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/03-thinking-react/</guid><description>Cómo piensa un desarrollador de React: descomponer UI en componentes, identificar el estado mínimo necesario y ubicar dónde debe vivir ese estado. El proceso mental antes de escribir código.</description></item><item><title>Miércoles — Interceptor Global de Logging</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/miercoles/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/miercoles/</guid><description>Construye un interceptor que registra cada request con su método, ruta y tiempo de respuesta, aplicado globalmente a toda la API.</description></item><item><title>Martes — Motor de Matriculación</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/martes/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/martes/</guid><description>Construye el motor de matriculación de SGAF, demostrando con datos reales que tu API respeta el límite de créditos, el cupo de los grupos y los traslapes de horario.</description></item><item><title>Martes — Punto de Venta (POS)</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/martes/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/martes/</guid><description>Construye el módulo de venta de mostrador: carrito interno, cobro y deducción inmediata de stock.</description></item><item><title>Miércoles — DTOs y Validación con Pipes</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/miercoles/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/miercoles/</guid><description>Reemplaza la validación con Zod de la Semana 5 por DTOs de class-validator y un ValidationPipe global, aplicados al CRUD de pacientes y médicos.</description></item><item><title>Miércoles — Expediente del Paciente y Autenticación con JWT</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/miercoles/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/miercoles/</guid><description>Construye la vista de expediente con relaciones de Prisma e integra un kit de autenticación con JWT y middlewares de autorización por rol.</description></item><item><title>Miércoles S5 — include Anidado, orderBy y Array Vacío vs. null en 1:N</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-5/miercoles/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-5/miercoles/</guid><description>El maestro agrega el modelo Modulo al schema, ejecuta una segunda migración, y enseña include anidado (Instructor → Curso → Modulo), orderBy por campo propio y campo de relación, y la diferencia entre null y [] en los dos lados de una relación 1:N.</description></item><item><title>Miércoles S4 — Validación con Zod y Middlewares de Validación</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/miercoles/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/miercoles/</guid><description>El maestro instala Zod, define schemas tipados para los cuerpos de las peticiones, crea una fábrica de middleware de validación genérica y la integra en las rutas POST y PUT — reemplazando las validaciones manuales con if/typeof por errores estructurados con nombre de campo y mensaje.</description></item><item><title>Miércoles S1 — DDL: CREATE, DROP, Constraints y ALTER TABLE</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/miercoles/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/miercoles/</guid><description>El maestro traduce el esquema lógico del martes a DDL real, formaliza las restricciones físicas NOT NULL, UNIQUE y FOREIGN KEY, y enseña ALTER TABLE para evolucionar un esquema sin destruirlo.</description></item><item><title>Miércoles S2 — Funciones, Arrow Functions, Callbacks e Interfaces</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/miercoles/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/miercoles/</guid><description>El maestro construye un sistema de gestión de cursos paso a paso: primero con funciones nombradas (y demuestra hoisting), luego reescribe con arrow functions, introduce callbacks tipados para procesar inscripciones, y termina modelando los datos con interfaces y types.</description></item><item><title>Miércoles S3 — req.query, Express Router, Módulos y Separación de Archivos</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/miercoles/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/miercoles/</guid><description>El maestro añade filtrado por query string al GET de cursos, luego refactoriza el índice monolítico del martes en cuatro archivos con responsabilidad única: types, utils, routes y app — dejando index.ts reducido a una sola línea de listen.</description></item><item><title>Miércoles — Enrutamiento Dinámico y Refactorización</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/miercoles/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/miercoles/</guid><description>Extrae las rutas a un Router independiente, filtra estudiantes por query string y agrega el endpoint de búsqueda por ID.</description></item><item><title>Miércoles — Estructura Física con DDL</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/miercoles/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/miercoles/</guid><description>Traduce el diagrama ER a sentencias SQL reales: crea la base de datos, define las tablas con sus tipos de datos y establece todas las restricciones de integridad.</description></item><item><title>Día 3 — Matemáticas Computacionales y PEMDAS</title><link>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-3/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-3/</guid><description>Aprende los operadores aritméticos de la computadora, la ley suprema de PEMDAS y cómo usar paréntesis para controlar el orden de las operaciones.</description></item><item><title>Miércoles — Objetos, Interfaces y Funciones</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/miercoles/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/miercoles/</guid><description>Refactoriza el arreglo de strings a objetos tipados con una interface Task, y envuelve cada acción del menú en su propia arrow function.</description></item><item><title>Estados de Carga y Error en React</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/loading-error-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/loading-error-react/</guid><description>&lt;h1 id="manejo-de-loading-y-error" class="relative group"&gt;Manejo de Loading y Error &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#manejo-de-loading-y-error" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;Cuando React pide datos a un servidor, la respuesta no es instantánea. Sin manejar ese tiempo, el usuario verá una pantalla en blanco o la app se romperá.&lt;/p&gt;
&lt;p&gt;La solución: &lt;strong&gt;La Trinidad de las Peticiones HTTP&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="los-3-estados" class="relative group"&gt;Los 3 Estados &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#los-3-estados" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsuario&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// datos (éxito)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cargando&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCargando&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// booleano inicia en true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// mensaje de error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;cargando&lt;/code&gt; inicia en &lt;code&gt;true&lt;/code&gt; porque la petición comienza apenas el componente se monta.&lt;/p&gt;</description></item><item><title>Navegación con React Router DOM</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/react-router-dom/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/react-router-dom/</guid><description>&lt;h1 id="navegación-con-react-router-dom" class="relative group"&gt;Navegación con React Router DOM &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#navegaci%c3%b3n-con-react-router-dom" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;React construye &lt;strong&gt;SPAs&lt;/strong&gt; (Single Page Applications): solo hay un archivo HTML. Al navegar, React destruye el componente actual y dibuja el nuevo sin recargar el navegador. Para sincronizar eso con la URL usamos &lt;strong&gt;React Router DOM&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-instalación-y-configuración" class="relative group"&gt;1. Instalación y Configuración &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#1-instalaci%c3%b3n-y-configuraci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install react-router-dom
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Envuelve toda la app en &lt;code&gt;main.jsx&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Repaso y Arquitectura Avanzada en React</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/repaso-arquitectura-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/repaso-arquitectura-react/</guid><description>&lt;h1 id="repaso-de-la-semana-2-y-arquitectura-avanzada" class="relative group"&gt;Repaso de la Semana 2 y Arquitectura Avanzada &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#repaso-de-la-semana-2-y-arquitectura-avanzada" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;hr&gt;
&lt;h2 id="repaso-rápido--lo-que-ya-dominas" class="relative group"&gt;Repaso Rápido Lo que ya dominas &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#repaso-r%c3%a1pido--lo-que-ya-dominas" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Concepto&lt;/th&gt;
 &lt;th&gt;Regla clave&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;useEffect + GET&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Arreglo &lt;code&gt;[]&lt;/code&gt; se ejecuta solo al montar. POST/PUT/DELETE van en eventos.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Loading &amp;amp; Error&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Siempre maneja las 3 fases: &lt;em&gt;cargando&lt;/em&gt;, &lt;em&gt;error&lt;/em&gt;, &lt;em&gt;datos&lt;/em&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;React Router&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;Link to=&amp;quot;&amp;quot;&amp;gt;&lt;/code&gt; nunca &lt;code&gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&lt;/code&gt;. &lt;code&gt;useParams&lt;/code&gt; para rutas dinámicas.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="el-siguiente-nivel-usereducer" class="relative group"&gt;El Siguiente Nivel: &lt;code&gt;useReducer&lt;/code&gt; &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#el-siguiente-nivel-usereducer" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;useState&lt;/code&gt; es ideal para datos simples. Cuando el estado es complejo (carrito de compras, formulario multi-paso), usamos &lt;code&gt;useReducer&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>El Contexto en React (useContext)</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/use-context-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/use-context-react/</guid><description>&lt;h1 id="el-contexto-en-react--usecontext" class="relative group"&gt;El Contexto en React &lt;code&gt;useContext&lt;/code&gt; &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#el-contexto-en-react--usecontext" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;hr&gt;
&lt;h2 id="el-problema-prop-drilling" class="relative group"&gt;El Problema: Prop Drilling &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#el-problema-prop-drilling" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Cuando un dato tiene que pasar por componentes intermedios que no lo necesitan, solo para llegar a uno profundo, eso se llama &lt;strong&gt;Prop Drilling&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// El Abuelo tiene el dato
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTema&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;oscuro&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;SeccionPrincipal&lt;/span&gt; &lt;span class="na"&gt;tema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;tema&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;SeccionPrincipal&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;tema&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// No lo usa, solo lo pasa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Tarjeta&lt;/span&gt; &lt;span class="na"&gt;tema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;tema&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Tarjeta&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;tema&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// No lo usa, solo lo pasa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Boton&lt;/span&gt; &lt;span class="na"&gt;tema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;tema&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Boton&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;tema&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Finalmente lo usa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;tema&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Clic&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analogía:&lt;/strong&gt; Es como pasarle un paquete a cada vecino del edificio solo para que llegue al sótano a nadie del camino le importaba el paquete.&lt;/p&gt;</description></item><item><title>Estado Global de Usuario (Login y Logout)</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/auth-context-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/auth-context-react/</guid><description>&lt;h1 id="estado-global-de-usuario--login-y-logout" class="relative group"&gt;Estado Global de Usuario Login y Logout &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#estado-global-de-usuario--login-y-logout" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;Toda la app necesita saber quién está conectado: el &lt;code&gt;&amp;lt;Navbar&amp;gt;&lt;/code&gt; para mostrar su nombre, &lt;code&gt;/perfil&lt;/code&gt; para sus datos&amp;hellip; Combinamos &lt;code&gt;useState&lt;/code&gt; + &lt;code&gt;useContext&lt;/code&gt; para resolverlo sin prop drilling.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-el-proveedor-de-autenticación" class="relative group"&gt;1. El Proveedor de Autenticación &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#1-el-proveedor-de-autenticaci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Crea &lt;code&gt;src/context/AuthContext.jsx&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AuthContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;AuthProvider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsuario&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// null = nadie logueado
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;datos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setUsuario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;datos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;logout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setUsuario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;AuthContext.Provider&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;logout&lt;/span&gt; &lt;span class="p"&gt;}}&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;AuthContext.Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2-envolver-la-app-en-mainjsx" class="relative group"&gt;2. Envolver la App en &lt;code&gt;main.jsx&lt;/code&gt; &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#2-envolver-la-app-en-mainjsx" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AuthProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./context/AuthContext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BrowserRouter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;react-router-dom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;BrowserRouter&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;AuthProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;App&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;AuthProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;BrowserRouter&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-navbar-inteligente" class="relative group"&gt;3. Navbar Inteligente &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#3-navbar-inteligente" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AuthContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../context/AuthContext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Navbar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;logout&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Bienvenido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;logout&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Cerrar&lt;/span&gt; &lt;span class="nx"&gt;Sesión&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/login&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Iniciar&lt;/span&gt; &lt;span class="nx"&gt;Sesión&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="4-pantalla-de-login" class="relative group"&gt;4. Pantalla de Login &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#4-pantalla-de-login" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useNavigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;react-router-dom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AuthContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../context/AuthContext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;navigate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useNavigate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;manejarEnvio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// En producción: fetch() al backend para validar credenciales
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Estudiante&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rol&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;manejarEnvio&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Correo&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;password&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Contraseña&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;submit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Entrar&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="5-rutas-protegidas-el-cadenero" class="relative group"&gt;5. Rutas Protegidas (El Cadenero) &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#5-rutas-protegidas-el-cadenero" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// src/components/RutaProtegida.jsx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Navigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;react-router-dom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AuthContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../context/AuthContext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;RutaProtegida&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Navigate&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/login&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Sin sesión fuera
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Con sesión pasa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Úsalo en &lt;code&gt;App.jsx&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Custom Hooks — Tus Propias Herramientas</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/custom-hooks-react/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/custom-hooks-react/</guid><description>&lt;p&gt;Cuando repites la misma combinacion de Hooks en diferentes pantallas, React te permite empaquetar esa logica en tu propio Hook para reutilizarla donde quieras.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="la-regla-de-oro" class="relative group"&gt;La Regla de Oro &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#la-regla-de-oro" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Un Custom Hook es una funcion normal de JavaScript con dos reglas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;El nombre DEBE empezar con &lt;code&gt;use&lt;/code&gt;&lt;/strong&gt; (ej. &lt;code&gt;useFormulario&lt;/code&gt;, &lt;code&gt;useFetch&lt;/code&gt;). Si no, React no te dejara usar otros Hooks adentro.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debe llamar a otros Hooks en su interior&lt;/strong&gt; (&lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="ejemplo-1-usetoggle--el-interruptor" class="relative group"&gt;Ejemplo 1: &lt;code&gt;useToggle&lt;/code&gt; — El Interruptor &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#ejemplo-1-usetoggle--el-interruptor" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;El mismo patron se repite en modales, menus y acordeones:&lt;/p&gt;</description></item><item><title>Introduccion a Supabase</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/intro-supabase/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/intro-supabase/</guid><description>&lt;p&gt;Hasta ahora nuestra informacion vive solo en el navegador. Al cerrar la pestana, se pierde. Para construir apps reales necesitamos una base de datos y un backend. Supabase nos da ambos en minutos.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="que-es-supabase" class="relative group"&gt;Que es Supabase? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#que-es-supabase" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Supabase es un &lt;strong&gt;BaaS (Backend as a Service)&lt;/strong&gt;: una plataforma que te entrega un backend completo listo para usar, sin necesidad de programarlo desde cero. Es la alternativa open-source mas popular a Firebase de Google.&lt;/p&gt;</description></item><item><title>Integrando Supabase en React — CRUD y Autenticacion</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/supabase-crud-auth/</link><pubDate>Thu, 26 Feb 2026 11:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/supabase-crud-auth/</guid><description>&lt;p&gt;Hoy conectamos React con la base de datos y el sistema de usuarios de Supabase.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-instalacion-y-configuracion" class="relative group"&gt;1. Instalacion y Configuracion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#1-instalacion-y-configuracion" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install @supabase/supabase-js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Crea &lt;code&gt;src/supabase.js&lt;/code&gt; con tus llaves del Dashboard de Supabase:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;@supabase/supabase-js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// En produccion estas credenciales deben ir en un archivo .env
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabaseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://tucodigo.supabase.co&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabaseKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tu-clave-anonima&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;supabaseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;supabaseKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2-crud-con-supabase" class="relative group"&gt;2. CRUD con Supabase &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#2-crud-con-supabase" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Imaginemos una tabla llamada &lt;code&gt;tareas&lt;/code&gt;. Las cuatro operaciones basicas:&lt;/p&gt;</description></item><item><title>Jueves — Métricas y Notificaciones</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/jueves/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/jueves/</guid><description>Expone un endpoint de métricas solo para el personal interno, con datos agrupados listos para graficar, e implementa el módulo de notificaciones por WebSockets o por correo ante los eventos importantes del sistema.</description></item><item><title>04 — Paginación, Fetch vs Axios y useSearchParams</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/04-paginacion-http/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/04-paginacion-http/</guid><description>Por qué guardar la paginación en la URL (y no en useState) es lo que hace que compartir un link o usar el botón atrás funcione, y los criterios reales para elegir entre fetch y Axios según el contexto. Ejemplo de práctica con un historial de pedidos.</description></item><item><title>04 — Repaso General (Semanas 1-4) y Git Individual</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/04-repaso-general/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/04-repaso-general/</guid><description>Guía de repaso para resolver dudas acumuladas de las 4 semanas antes del cierre del módulo, organizada por semana con las confusiones más comunes de cada tema. Incluye flujo de Git individual (ramas, commits, PR a tu propio repo).</description></item><item><title>04 — TypeScript Generics, Debounce y Sincronización con la API</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/04-generics-debounce/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/04-generics-debounce/</guid><description>Qué es realmente un Generic (un parámetro, pero de tipo en vez de valor), por qué escribir una función por cada entidad no escala, y por qué debounce retrasa la llamada sin retrasar la respuesta visual del input. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>04 — useEffect, React Hook Form y Zod</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/04-useeffect-rhf-zod/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/04-useeffect-rhf-zod/</guid><description>Qué es realmente un efecto secundario y por qué useEffect existe para sincronizar con sistemas externos (no como un &amp;lsquo;hook para todo&amp;rsquo;), y cómo React Hook Form + Zod resuelven la validación de formularios sin controlar cada input manualmente. Ejemplo de práctica con una reseña de producto.</description></item><item><title>Clases Tailwind — Referencia Rápida</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/04-clases-tailwind/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/04-clases-tailwind/</guid><description>Las clases de Tailwind CSS que más usarás en el desarrollo frontend, más un refuerzo de las etiquetas HTML más comunes y su equivalente en JSX.</description></item><item><title>Día 4 — Buscador con Debounce y Filtros Globales</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-4/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-4/</guid><description>Implementas el hook useDebounce tipado con Generics, el buscador de pacientes conectado a la API real con delay de 350ms y un store de filtros que persiste entre navegaciones de ruta.</description></item><item><title>Día 4 — Formulario de Nueva Cita con RHF + Zod</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-4/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-4/</guid><description>Construyes el formulario de agenda de citas con React Hook Form y Zod, con validación completa, estados de carga y feedback visual. Esta página será la ruta /citas/nueva del proyecto.</description></item><item><title>Día 4 — Historial de Citas Paginado</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-4/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-4/</guid><description>Implementas la paginación del historial de citas usando useSearchParams para que la página activa viva en la URL, con filtro de estado que persiste entre navegaciones.</description></item><item><title>Día 4 — Repaso General y Pulido de la Clínica</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-4/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-4/</guid><description>Día de consolidación: revisas tu propia Clínica contra lo visto en las 4 semanas, corriges lo que quedó pendiente, y practicas el flujo de Git individual (ramas, commits, PR a tu propio repositorio).</description></item><item><title>Entrevista — Preguntas Frecuentes sobre Hooks</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/04-entrevista-hooks/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/04-entrevista-hooks/</guid><description>Preguntas de entrevista técnica sobre Hooks de React: reglas de los hooks, dependencias de useEffect, custom hooks y useOptimistic. Practica responderlas en voz alta.</description></item><item><title>Jueves — Caja</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/jueves/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/jueves/</guid><description>Construye la interfaz de apertura, cierre y conciliación de caja, comparando el efectivo reportado contra el total de ventas de POS procesadas.</description></item><item><title>Jueves — Control Financiero y Suspensión por Mora</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/jueves/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/jueves/</guid><description>Construye el historial de pagos, la validación manual de Recepción y la comunicación explícita de la suspensión automática por mora en la interfaz.</description></item><item><title>Seguridad en el Frontend — Buenas Prácticas</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/04-seguridad-front/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/04-seguridad-front/</guid><description>Por qué localStorage es vulnerable a XSS y qué trade-offs trae la alternativa (cookies httpOnly), y por qué la validación del cliente nunca reemplaza la del backend.</description></item><item><title>useMemo y useCallback — Cuándo Vale la Pena</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/04-memoizacion/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/04-memoizacion/</guid><description>Qué problema resuelven useMemo y useCallback (la comparación por referencia entre renders), cuándo sí ayudan y cuándo son una micro-optimización innecesaria que solo agrega complejidad.</description></item><item><title>Jueves — Configuración de Entornos con @nestjs/config</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/jueves/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/jueves/</guid><description>Reemplaza las lecturas directas de process.env por ConfigService y agrega validación para que la app falle rápido si falta una variable crítica.</description></item><item><title>Miércoles — Aula Virtual y Control Financiero</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/miercoles/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/miercoles/</guid><description>Habilita el aula virtual (asignaciones, entregas y calificaciones) y el control financiero de SGAF, incluyendo la suspensión automática por mora.</description></item><item><title>Miércoles — Tienda en Línea, Sincronización y Logística</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/miercoles/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/miercoles/</guid><description>Habilita la tienda en línea para clientes web, demuestra la sincronización de inventario entre canales y construye la cola de órdenes con sus estados logísticos.</description></item><item><title>Jueves — Manejo de Errores con Exception Filters</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/jueves/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/jueves/</guid><description>Centraliza el manejo de errores de Prisma en un Exception Filter global, eliminando los try/catch repetidos del Controller.</description></item><item><title>Jueves — Módulo de Citas: Agendamiento y Atención</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/jueves/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/jueves/</guid><description>Agenda citas con reglas de negocio validadas por Zod, construye la agenda del médico filtrada por rango de fechas y gestiona el cambio de estado de una cita.</description></item><item><title>Jueves S5 — update() Parcial, Errores P2025, Rangos de Fecha, groupBy y $queryRaw</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-5/jueves/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-5/jueves/</guid><description>El maestro completa el CRUD de Prisma: update() parcial sin merge manual, manejo tipado de P2025 con PrismaClientKnownRequestError, filtros de fecha con gte/lte en creadoEn, agregaciones con groupBy y _count/_avg, y consultas arbitrarias con $queryRaw tagged templates.</description></item><item><title>Jueves — Consultas Parametrizadas y API de Clientes</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/jueves/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/jueves/</guid><description>Revisa que tus queries usen parámetros seguros contra SQL Injection y construye la API completa de customers aplicando el mismo patrón MVC del martes.</description></item><item><title>Jueves S4 — Capa Services y Consultas Parametrizadas INSERT/UPDATE/DELETE</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/jueves/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/jueves/</guid><description>El maestro añade la capa Services entre Controller y Model, implementa INSERT, UPDATE y DELETE en cursoModel con RETURNING y parámetros posicionales múltiples ($1..$N), y conecta todo el flujo CRUD a PostgreSQL — al final de la clase un POST persiste en la DB y un GET lo confirma.</description></item><item><title>Jueves S1 — DML: INSERT, SELECT con Filtros, UPDATE y DELETE Seguros</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/jueves/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/jueves/</guid><description>El maestro profundiza en la inserción de datos, introduce los operadores de filtrado LIKE, BETWEEN e IN, y dedica especial atención a los peligros reales de UPDATE y DELETE sin condición — con patrones de buenas prácticas para prevenirlos.</description></item><item><title>Jueves S2 — Desestructuración y Métodos Funcionales de Arrays</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/jueves/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/jueves/</guid><description>El maestro trabaja con un array de inscripciones de la Academia TechPath: primero extrae datos con desestructuración de objetos y arrays, luego los procesa con forEach, map, filter, find, some e includes — construyendo un reporte de rendimiento completo al final del día.</description></item><item><title>Jueves S3 — OpenAPI, Swagger UI y swagger-autogen</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/jueves/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/jueves/</guid><description>El maestro introduce OpenAPI como estándar de documentación, instala swagger-ui-express y swagger-autogen en academia-api, configura el script de generación, añade anotaciones en las rutas de cursos y prueba todos los endpoints directamente desde la interfaz Swagger UI.</description></item><item><title>Jueves — Documentación Profesional con Swagger</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/jueves/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/jueves/</guid><description>Genera documentación interactiva de la API con swagger-autogen y swagger-ui-express, y prueba todos los endpoints directamente desde el navegador.</description></item><item><title>Jueves — Población y Modificación de Datos</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/jueves/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/jueves/</guid><description>Llena la base de datos con datos de prueba realistas usando INSERT INTO, simula cambios de negocio con UPDATE y practica el borrado seguro con DELETE.</description></item><item><title>Día 4 — Finanzas Básicas y Operadores Relacionales</title><link>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-4/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-4/</guid><description>Calcula impuestos y descuentos con decimales, aprende los operadores relacionales para comparar valores, y descubre el bloque de Selección que rompe la linealidad de tus programas.</description></item><item><title>Jueves — Métodos Funcionales y Colaboración</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/jueves/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/jueves/</guid><description>Agrega filtrado por estado, reemplaza el ciclo for por métodos funcionales (map, filter, find, forEach) y abre tu primer Pull Request.</description></item><item><title>Viernes — Pulido, Valor Agregado y Entrega Final</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/viernes/</link><pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/scrum/help-desk-backend/viernes/</guid><description>Día de entrega: sin funcionalidades nuevas. Se corrigen detalles, se unifica el manejo de errores, se documenta la API y se prepara la demo del equipo.</description></item><item><title>05 — Cierre del Módulo: Checklist y Demo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/05-cierre-demo/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s04/05-cierre-demo/</guid><description>Guía para la sesión de cierre de las 4 semanas de la Clínica: checklist de lo que debería estar completo, cómo estructurar las demos, errores de último momento más comunes en producción y qué observar antes de pasar al proyecto de la semana 5.</description></item><item><title>05 — React Router DOM, Rutas Dinámicas y Navegación</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/05-react-router/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s01/05-react-router/</guid><description>Cómo React Router intercepta la navegación y usa la History API del navegador para cambiar de pantalla sin recargar la página. BrowserRouter, Routes, NavLink activo, Outlet para layouts compartidos, useParams y useNavigate. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>05 — Tipado Estricto y Recharts con Datos Reales</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/05-tipado-recharts/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s02/05-tipado-recharts/</guid><description>Por qué el catch de TypeScript tipa el error como unknown y no como any, cómo un type guard le devuelve seguridad a ese unknown, y los Utility Types que evitan repetir campos entre tus DTOs. Ejemplo de práctica con reportes de un catálogo de productos.</description></item><item><title>05 — UI Robusta: Skeleton Loaders, Error Boundaries y Componentes Reusables</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/05-ui-robusta/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/maestro/s03/05-ui-robusta/</guid><description>Por qué un skeleton reduce la percepción de espera más que un spinner, cómo React decide hasta dónde &amp;lsquo;desmonta&amp;rsquo; el árbol cuando un componente lanza un error sin Error Boundary, y una biblioteca mínima de componentes de UI reutilizables. Ejemplo de práctica con un catálogo de productos.</description></item><item><title>Custom Hooks — Extrayendo Lógica Reutilizable</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/05-custom-hooks-intro/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/05-custom-hooks-intro/</guid><description>Qué hace que una función sea un hook &amp;lsquo;de verdad&amp;rsquo; (no solo el nombre), y por qué separar la lógica con estado en un Custom Hook separa &amp;lsquo;qué hace la pantalla&amp;rsquo; de &amp;lsquo;cómo se ve&amp;rsquo;.</description></item><item><title>Día 5 — App Prod Full Stack (MP3)</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-5/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp3-app-prod-full-stack/dia-5/</guid><description>El MP3 se completa con Skeleton Loaders en todas las páginas, Error Boundaries en las secciones críticas y la biblioteca de componentes UI compartidos. La app está lista para producción.</description></item><item><title>Día 5 — Cierre: Clínica Completa en Producción (MP4)</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-5/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp4-clinica-optimizada/dia-5/</guid><description>Verificación final de punta a punta, últimos ajustes de producción y demo de tu Clínica completa — el cierre de las 4 semanas de frontend antes de arrancar un proyecto nuevo en la semana 5.</description></item><item><title>Día 5 — Frontend Fuertemente Tipado con Dashboard (MP2)</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-5/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp2-frontend-fuertemente-tipado/dia-5/</guid><description>Mini-Proyecto 2 completo: la SPA de la clínica con tipado estricto usando Utility Types, type guards en todos los catch, y un dashboard de reportes con dos gráficas de Recharts conectadas a la API real.</description></item><item><title>Día 5 — SPA Navegable Completa (MP1)</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-5/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/mps/mp1-spa-navegable/dia-5/</guid><description>Conectas todas las páginas construidas durante la semana con React Router DOM. El resultado es la SPA completa de la clínica con 5 rutas navegables, layout compartido y navegación programática.</description></item><item><title>Discusión AI Tools</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/05-discusion-ai-tools/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/05-discusion-ai-tools/</guid><description>Comparativa crítica de herramientas de IA para desarrollo frontend. Cómo integrarlas en el flujo de trabajo sin perder el control del código, y qué revisar en el Tailwind que generan.</description></item><item><title>FormData y multipart/form-data — Guía de Referencia</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/05-formdata-multipart/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/05-formdata-multipart/</guid><description>Referencia rápida de la API FormData del navegador y del formato multipart/form-data: por qué los archivos no viajan como JSON y cómo combinar texto y archivos en un solo envío.</description></item><item><title>Repaso Semanal — Semana 2</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/05-repaso-semanal/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/05-repaso-semanal/</guid><description>Resumen de los conceptos clave de la Semana 2. Úsalo para consolidar lo aprendido antes de comenzar la Semana 3.</description></item><item><title>Viernes — Pulido, Despliegue y Demo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/viernes/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/pos-ecommerce-hibrido/viernes/</guid><description>Aplica lazy loading, memoización y Custom Hooks propios sobre el sistema POS + E-commerce, despliega en Vercel conectado a tu backend real y cierra con una demo de punta a punta.</description></item><item><title>Viernes — Rendimiento, Despliegue y Demo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/viernes/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/pfs/sgaf-gestion-academica-financiera/viernes/</guid><description>Aplica lazy loading, memoización y Custom Hooks propios sobre SGAF, despliega en Vercel conectado a tu backend real y cierra con una demo de punta a punta.</description></item><item><title>Viernes — Repaso, Documentación y Entrega Final</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/viernes/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/cierre-clinica-salud-integral/viernes/</guid><description>Cierra la semana con un repaso integrador del pipeline completo de NestJS, documentación pulida y la entrega final antes de pasar a despliegue en la Semana 9.</description></item><item><title>Jueves — Caja, Documentación, Despliegue y Demo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/jueves/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/pos-ecommerce-hibrido/jueves/</guid><description>Habilita la apertura, cierre y conciliación de caja, documenta con Swagger y despliega el sistema en Render con base de datos en Supabase, sembrado y listo para la demo.</description></item><item><title>Jueves — Documentación, Despliegue y Demo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/jueves/</link><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/pfs/sgaf-gestion-academica-financiera/jueves/</guid><description>Documenta con Swagger, despliega SGAF en Render con base de datos en Supabase y deja el ambiente de producción sembrado y listo para la demo.</description></item><item><title>Viernes — Guards de Autenticación y Autorización por Rol</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/viernes/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/nest-clinica-salud-integral/viernes/</guid><description>Migra tu kit de JWT de la Semana 5 a un AuthGuard y un RolesGuard de NestJS, protegiendo el módulo de Pacientes según el rol del usuario.</description></item><item><title>Viernes — Reportes de Gerencia y Entrega Final</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/viernes/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-clinica-salud-integral/viernes/</guid><description>Construye los dos reportes de gerencia combinando groupBy y $queryRaw parametrizado, documenta la API con Swagger y entrega el proyecto final.</description></item><item><title>Viernes — Filtros, Paginación y API de Ventas</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/viernes/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-rincon-del-sabor/viernes/</guid><description>Agrega filtros con req.query y paginación LIMIT/OFFSET a productos, luego construye la API de ventas — la tercera tabla principal de la semana.</description></item><item><title>Viernes S4 — Paginación, LIMIT/OFFSET y Queries Dinámicas</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/viernes/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-4/viernes/</guid><description>El maestro implementa paginación con LIMIT y OFFSET en cursoModel.findAll, valida los query params de paginación y filtros con z.coerce, retorna metadatos de paginación en la respuesta y añade ordenamiento dinámico seguro con un mapa de columnas permitidas.</description></item><item><title>Viernes S1 — JOINs, Práctica Integradora y Cierre de Semana</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/viernes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-1/viernes/</guid><description>El maestro enseña INNER JOIN y LEFT JOIN sobre el esquema de la semana, guía una práctica integradora donde los alumnos construyen un sistema completo desde cero, y cierra con una charla sobre cómo los ORMs automatizarán el SQL que acaban de aprender.</description></item><item><title>Viernes S2 — Event Loop, Promesas, Async/Await y try/catch</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/viernes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-2/viernes/</guid><description>Cierre de semana con asincronía: el maestro demuestra el Event Loop con un experimento de orden de ejecución, construye un flujo de certificación con .then/.catch, lo reescribe con async/await, lo envuelve en try/catch y termina con Promise.all como capstone del día y de la semana.</description></item><item><title>Viernes S3 — Variables de Entorno, CORS y Ejercicio Grupal</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/viernes/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/maestro/semana-3/viernes/</guid><description>El maestro integra variables de entorno nativas con &amp;ndash;env-file, explica CORS y configura el middleware cors. El día cierra con un ejercicio grupal donde equipos de 3–4 personas construyen una API completa desde cero aplicando todo lo aprendido en la semana.</description></item><item><title>Viernes — Consultas Multitabla y Reportería</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/viernes/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/bd-gestor-pedidos-restaurantes/viernes/</guid><description>Escribe consultas SQL progresivas con INNER JOIN para extraer información útil del sistema: desde filtros básicos hasta el ticket completo de un pedido.</description></item><item><title>Viernes — Variables de Entorno, CORS y Prueba Final</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/viernes/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/api-inscripciones/viernes/</guid><description>Configura variables de entorno con soporte nativo de Node, resuelve el error de CORS y prueba la API con un cliente real a través del Port Forwarding de VS Code.</description></item><item><title>Día 5 — Lógica Booleana, Arrays y Repaso Integrador</title><link>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-5/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/clases-preparacion/dia-5/</guid><description>Combina condiciones con AND y OR, aprende qué son los Arreglos y cómo acceder a ellos por índice, y une las 5 herramientas de Raptor en un ejercicio integrador.</description></item><item><title>Viernes — Asincronismo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/viernes/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/mps/ts-gestor-tareas/viernes/</guid><description>Agrega simulación de guardado asíncrono con async/await, Promesas y manejo de errores con try/catch. Cierre del proyecto y reto extra.</description></item><item><title>Códigos de Estado HTTP — Guía de Referencia</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/06-codigos-http/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/06-codigos-http/</guid><description>Referencia rápida de los códigos de estado HTTP más comunes en APIs REST, agrupados por categoría (2xx/4xx/5xx), con cuándo corresponde usar cada uno.</description></item><item><title>Componiendo Hooks — Un Hook que Usa Otros Hooks</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/06-composicion-hooks/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/06-composicion-hooks/</guid><description>Un ejemplo concreto de un Custom Hook que compone otros hooks por dentro, y por qué esto evita repetir la misma lógica entre componentes distintos.</description></item><item><title>CORS en Desarrollo Local</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/06-cors-local/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/06-cors-local/</guid><description>Same-origin policy, qué es un preflight OPTIONS, los headers Access-Control-Allow-* y por qué CORS aparece en desarrollo cuando Vite y Express corren en puertos distintos.</description></item><item><title>Eventos React — Referencia</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/06-eventos-react/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/06-eventos-react/</guid><description>Referencia completa de los tipos de eventos de React y sus tipos TypeScript. Guía rápida para tipar correctamente cualquier handler de eventos.</description></item><item><title>Entrevista Frontend — Preguntas Frecuentes</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/07-entrevista-front/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/07-entrevista-front/</guid><description>Las preguntas de entrevista técnica de React más frecuentes con respuestas claras. Practica responderlas en voz alta — eso marca la diferencia en una entrevista real.</description></item><item><title>Paginación — Patrones en APIs REST</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/07-paginacion-patrones/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/07-paginacion-patrones/</guid><description>Offset/limit vs paginación por cursor, la convención page/pageSize, y por qué guardar la página actual en la URL (no en useState) mejora la experiencia de usuario.</description></item><item><title>Preparando tus Dudas para el Repaso General</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/07-prep-repaso/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/07-prep-repaso/</guid><description>Worksheet de autodiagnóstico de los grandes temas de las 4 semanas del módulo, para llegar a la clase de Repaso General con preguntas concretas en vez de &amp;rsquo;no me acuerdo de nada'.</description></item><item><title>UI Optimista — Cuándo Sí y Cuándo No</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/07-optimistic-ui/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/07-optimistic-ui/</guid><description>Qué es la UI optimista, el patrón &amp;lsquo;actualiza ya, revierte si falla&amp;rsquo;, y los criterios para decidir cuándo conviene usarla y cuándo es riesgoso.</description></item><item><title>Blob y File — Datos Binarios en el Navegador</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/08-blob-types/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/08-blob-types/</guid><description>Qué es un Blob y un File en el navegador, cómo funciona URL.createObjectURL, y en qué casos reales se usan: previsualizaciones y descargas de archivos generados en el cliente.</description></item><item><title>Estado de Paginación en la URL</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/08-estado-en-url/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/08-estado-en-url/</guid><description>useSearchParams vs useState para guardar la página actual, y por qué guardar la paginación en la URL permite compartir un link o usar el botón atrás del navegador.</description></item><item><title>UX Forms — Diseño de Formularios</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/08-ux-forms/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/08-ux-forms/</guid><description>Principios de diseño de formularios que impactan directamente en las tasas de conversión y abandono. Un formulario bien diseñado guía al usuario; uno mal diseñado lo frustra.</description></item><item><title>Zustand — Referencia Rápida de API</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/08-zustand-docs/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/08-zustand-docs/</guid><description>Recetas cortas de la API de Zustand: create, set, get, selectores, y los middlewares persist y devtools.</description></item><item><title>Performance API y el Network Tab</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/09-performance-api/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/09-performance-api/</guid><description>Qué es la Performance API del navegador, cómo leer el Network tab de DevTools para medir una petición, y por qué esos números son la razón real para usar debounce.</description></item><item><title>Repaso Semanal — Semana 1</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/09-repaso-semanal/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/09-repaso-semanal/</guid><description>Resumen de los conceptos clave de la Semana 1. Úsalo para consolidar lo aprendido antes de comenzar la Semana 2.</description></item><item><title>Repaso Semanal — Semana 3</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/09-repaso-semanal/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/09-repaso-semanal/</guid><description>Resumen de los conceptos clave de la Semana 3: Auth JWT, rutas protegidas, refresh tokens, subida de archivos y UI robusta. Úsalo para consolidar lo aprendido antes de la Semana 4.</description></item><item><title>Repaso Semanal — Semana 4 (Cierre del Módulo)</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/09-repaso-semanal/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/09-repaso-semanal/</guid><description>Autoevaluación de la Semana 4 (deploy, code splitting, memoización, Custom Hooks) que además funciona como repaso de cierre de las 4 semanas completas del módulo de React.</description></item><item><title>Checklist Técnico para tu Demo</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/10-prep-demo/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s04/10-prep-demo/</guid><description>Checklist de verificación previo a cualquier demo: build sin errores, la app funciona contra la URL desplegada, hay datos de prueba, puedes recorrer el flujo principal de punta a punta y explicar tus decisiones de arquitectura.</description></item><item><title>Error Boundaries y Skeleton Loaders</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/10-ui-robusta/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s03/10-ui-robusta/</guid><description>Qué es un Error Boundary y hasta dónde &amp;lsquo;desmonta&amp;rsquo; el árbol cuando algo falla, y por qué un skeleton loader reduce la percepción de espera más que un spinner.</description></item><item><title>Rutas SPA — Cómo Funciona el Routing en el Frontend</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/10-rutas-spa/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s01/10-rutas-spa/</guid><description>La historia del routing en la web: de páginas del servidor a SPAs modernas. Cómo React Router intercepta URLs sin recargar la página y por qué importa para la experiencia de usuario.</description></item><item><title>TypeScript Aplicado a Frontend</title><link>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/10-ts-frontend/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pern/react/react/s02/10-ts-frontend/</guid><description>Utility Types (Partial, Pick, Omit, Record) con ejemplos, type guards, y un repaso rápido de Generics — preparación para la clase de Tipado y Recharts.</description></item><item><title>Práctica Calificada - Formulario de Registro</title><link>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-formularios-html/</link><pubDate>Wed, 29 Apr 2026 10:00:00 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-formularios-html/</guid><description>&lt;h1 id="-práctica-calificada-formulario-de-registro-de-visitas" class="relative group"&gt;📋 Práctica Calificada: Formulario de Registro de Visitas &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-pr%c3%a1ctica-calificada-formulario-de-registro-de-visitas" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-instrucciones" class="relative group"&gt;📖 Instrucciones &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-instrucciones" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Replica el diseño del formulario que se muestra a continuación usando &lt;strong&gt;HTML y CSS&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Crea dos archivos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;formulario-visita/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── index.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── styles.css
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;⚠️ No se requiere funcionalidad. El formulario solo debe &lt;strong&gt;verse igual&lt;/strong&gt; al diseño de referencia.&lt;br&gt;
⚠️ El CSS debe estar en un archivo &lt;strong&gt;separado&lt;/strong&gt; — no se acepta &lt;code&gt;style=&amp;quot;&amp;quot;&lt;/code&gt; ni &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; dentro del HTML.&lt;/p&gt;</description></item><item><title>El CV de Alto Impacto para Frontend Developers</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/cv-alto-impacto/</link><pubDate>Tue, 10 Mar 2026 14:51:02 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/cv-alto-impacto/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Duración estimada:&lt;/strong&gt; 45 min de estudio | &lt;strong&gt;Nivel:&lt;/strong&gt; Intermedio
&lt;strong&gt;Aplicabilidad:&lt;/strong&gt; Inmediata — este material es 100% práctico.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="objetivos-de-aprendizaje" class="relative group"&gt;Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase, serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Construir un CV estructurado que supere los filtros automáticos de IA (ATS)&lt;/li&gt;
&lt;li&gt;Redactar cada sección con un enfoque orientado a resultados (no tareas)&lt;/li&gt;
&lt;li&gt;Seleccionar y presentar tus proyectos como experiencia laboral real&lt;/li&gt;
&lt;li&gt;Identificar y corregir los errores más comunes que eliminan CVs en la primera revisión&lt;/li&gt;
&lt;li&gt;Adaptar tu CV a cada vacante sin reescribirlo desde cero&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="introducción" class="relative group"&gt;Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;El CV es el primer punto de contacto con una empresa, y tienes aproximadamente &lt;strong&gt;6 segundos&lt;/strong&gt; para causar impresión antes de que un reclutador lo cierre. Pero antes de llegar al reclutador humano, tu CV debe sobrevivir al &lt;strong&gt;ATS&lt;/strong&gt; (Applicant Tracking System): un software que escanea, filtra y puntúa automáticamente los CVs antes de que los vea cualquier persona.&lt;/p&gt;</description></item><item><title>Práctica Calificada 4 - Custom Hooks</title><link>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-custom-hooks/</link><pubDate>Wed, 25 Feb 2026 10:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-custom-hooks/</guid><description>&lt;p&gt;&lt;strong&gt;Reglas:&lt;/strong&gt; Prohibido escribir &lt;code&gt;fetch&lt;/code&gt; o &lt;code&gt;localStorage&lt;/code&gt; directamente dentro de un componente. Toda la lógica va en los hooks.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-api-a-consumir-open-library" class="relative group"&gt;🌐 API a consumir: Open Library &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-api-a-consumir-open-library" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Deberán consumir la &lt;strong&gt;API pública de Open Library&lt;/strong&gt; (no requiere API key ni registro).&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Endpoint de búsqueda&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://openlibrary.org/search.json?q={query}&amp;amp;limit=20&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Documentación&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://openlibrary.org/dev/docs/api" target="_blank" rel="noreferrer"&gt;https://openlibrary.org/dev/docs/api&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Ejemplo&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://openlibrary.org/search.json?q=harry+potter&amp;amp;limit=20&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Campos útiles de la respuesta&lt;/strong&gt; (&lt;code&gt;response.docs[]&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Harry Potter and the Sorcerer&amp;#39;s Stone&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;author_name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;J.K. Rowling&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;cover_i&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8228691&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// número de portada
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;first_publish_year&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1997&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/works/OL82592W&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;// identificador único
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;🖼️ Para mostrar la portada usa: &lt;code&gt;https://covers.openlibrary.org/b/id/{cover_i}-M.jpg&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Práctica Calificada 3 - useContext</title><link>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/</link><pubDate>Wed, 25 Feb 2026 09:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/</guid><description>&lt;h1 id="práctica-calificada-3-saas-dash" class="relative group"&gt;Práctica Calificada 3: SaaS Dash &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#pr%c3%a1ctica-calificada-3-saas-dash" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Reglas:&lt;/strong&gt; Solo React puro. Prohibido gestores de estado externos (Redux, Zustand, etc.).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referencias visuales:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;





&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login_hu_868f41f3710e7f83.webp"
 
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="451"
 height="1024"
 class="mx-auto my-0 rounded-md"
 alt="Login"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login.jpg"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;







&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2_hu_84e41aa64f246e0e.webp 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2_hu_e5f3807a290a066d.webp 660w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2_hu_49a926c4e7490ef.webp 1024w
 
 
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2_hu_49a926c4e7490ef.webp 1024w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1024"
 height="819"
 class="mx-auto my-0 rounded-md"
 alt="Login 2"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2_hu_9b6850a4b6fbeb7a.png" srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2_hu_1d36ca1ab91e0bab.png 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2_hu_9b6850a4b6fbeb7a.png 660w
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2.png 1024w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-login2.png 1024w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;







&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-mobile_hu_bc3cf83c073fa3ad.webp"
 
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="307"
 height="1024"
 class="mx-auto my-0 rounded-md"
 alt="Mobile Dashboard"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-mobile.jpg"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;







&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop_hu_5b62a98297f7194b.webp 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop_hu_3df679d21654604e.webp 660w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop_hu_6e573f7daa62e1cb.webp 1024w
 
 
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop_hu_6e573f7daa62e1cb.webp 1024w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1024"
 height="819"
 class="mx-auto my-0 rounded-md"
 alt="Desktop Dashboard"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop_hu_761c264d989796b6.jpg" srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop_hu_648c5bc95543a48d.jpg 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop_hu_761c264d989796b6.jpg 660w
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop.jpg 1024w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-usecontext/images/referencia-desktop.jpg 1024w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title> FakeStore API Catalog</title><link>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/</link><pubDate>Wed, 25 Feb 2026 08:00:00 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/</guid><description>&lt;h2 id="-objetivo" class="relative group"&gt;📖 Objetivo &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivo" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Aplicar los conocimientos de consumo de APIs, navegación con React Router DOM, y gestión de estados complejos (Hooks) mediante la creación de un &lt;strong&gt;catálogo de productos funcional&lt;/strong&gt; consumiendo &lt;a href="https://fakestoreapi.com" target="_blank" rel="noreferrer"&gt;FakeStoreAPI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referencias visuales:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;





&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop_hu_21ec0fb2d3003b07.webp 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop_hu_84ae98d8b7b87a06.webp 660w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop_hu_37602198d52cc500.webp 913w
 
 
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop_hu_37602198d52cc500.webp 913w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="913"
 height="1600"
 class="mx-auto my-0 rounded-md"
 alt="Desktop"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop_hu_1b0cd42446468554.jpg" srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop_hu_2d54060fbde38033.jpg 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop_hu_1b0cd42446468554.jpg 660w
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop.jpg 913w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-desktop.jpg 913w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;







&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-mobile_hu_3c0e462594596e4f.webp"
 
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="342"
 height="1600"
 class="mx-auto my-0 rounded-md"
 alt="Mobile"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-api-fake-store/images/referencia-mobile.jpg"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-setup-inicial" class="relative group"&gt;🛠️ Setup Inicial &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-setup-inicial" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm create vite@latest fake-store-catalog -- --template react
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; fake-store-catalog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install react-router-dom axios
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Estructura de carpetas requerida:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Práctica Calificada 2 - React Wallet</title><link>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/</link><pubDate>Tue, 24 Feb 2026 11:33:04 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/</guid><description>&lt;h1 id="práctica-calificada-2-react-wallet" class="relative group"&gt;Práctica Calificada 2: React Wallet &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#pr%c3%a1ctica-calificada-2-react-wallet" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;Usa el código base (HTML/CSS estático) entregado por el instructor y hazlo dinámico con React.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referencia visual:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;





&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop_hu_4038466a6876523d.webp 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop_hu_40d46bf78eeb5fb7.webp 660w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop_hu_107b53c1ee3219a1.webp 1024w
 
 
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop_hu_107b53c1ee3219a1.webp 1024w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1024"
 height="819"
 class="mx-auto my-0 rounded-md"
 alt="Desktop"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop_hu_9850a82e98fe74fe.jpg" srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop_hu_e324a19fffe6280b.jpg 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop_hu_9850a82e98fe74fe.jpg 660w
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop.jpg 1024w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-desktop.jpg 1024w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;







&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-mobile_hu_71f8ca24967990c5.webp"
 
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="451"
 height="1024"
 class="mx-auto my-0 rounded-md"
 alt="Mobile"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-wallet-react/images/referencia-mobile.jpg"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cada transacción tiene la forma: &lt;code&gt;{ id, text, amount }&lt;/code&gt; — amount negativo = gasto, positivo = ingreso.&lt;/p&gt;</description></item><item><title>Práctica Calificada - ReactTube</title><link>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/</link><pubDate>Tue, 24 Feb 2026 09:49:28 -0400</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/</guid><description>&lt;h1 id="-práctica-calificada-reacttube" class="relative group"&gt;🎬 Práctica Calificada: ReactTube &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-pr%c3%a1ctica-calificada-reacttube" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-contexto" class="relative group"&gt;📖 Contexto &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-contexto" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Has sido contratado como &lt;strong&gt;Frontend Developer Junior&lt;/strong&gt; para &lt;strong&gt;&amp;ldquo;ReactTube&amp;rdquo;&lt;/strong&gt;. El equipo de Backend te entregó una lista de datos simulada. Tu misión: construir la interfaz y conectar los eventos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vista de referencia (desktop y mobile):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;





&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop_hu_dbd577dc37a5ef01.webp 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop_hu_71e65825d673063c.webp 660w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop_hu_ff17eeac2a01cb3d.webp 1024w
 
 
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop_hu_ff17eeac2a01cb3d.webp 1024w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1024"
 height="901"
 class="mx-auto my-0 rounded-md"
 alt="Referencia Desktop"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop_hu_5e0d16e3a2505bc7.jpg" srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop_hu_5fbbf4d5ac21ae45.jpg 330w,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop_hu_5e0d16e3a2505bc7.jpg 660w
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop.jpg 1024w
 
 
 ,https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-desktop.jpg 1024w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;







&lt;figure&gt;
 
 








 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 &lt;source
 
 
 srcset="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-mobile_hu_e8f36c535e68230.webp"
 
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="276"
 height="1024"
 class="mx-auto my-0 rounded-md"
 alt="Referencia Mobile"
 loading="lazy" decoding="async"
 
 src="https://fundacion-de-valores.github.io/software-development-platform/pc/practica-calificada-react/images/referencia-mobile.jpg"
 
 /&gt;
 &lt;/picture&gt;
 


&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Practica De Prueba</title><link>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-de-prueba/</link><pubDate>Mon, 23 Feb 2026 16:51:06 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/pc/practica-de-prueba/</guid><description>&lt;h1 id="práctica-de-prueba" class="relative group"&gt;Práctica de Prueba &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#pr%c3%a1ctica-de-prueba" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;Esta es una práctica de prueba para demostrar cómo crear contenido en la plataforma de desarrollo de software de la Fundación de Valores.&lt;/p&gt;</description></item><item><title>React Componentes</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/react-componentes/</link><pubDate>Thu, 19 Feb 2026 09:15:24 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/react-componentes/</guid><description>&lt;h1 id="introducción-a-reactjs--componentes-funcionales" class="relative group"&gt;Introducción a ReactJS | Componentes Funcionales &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#introducci%c3%b3n-a-reactjs--componentes-funcionales" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Duración estimada:&lt;/strong&gt; 1 hora de estudio&lt;br&gt;
&lt;strong&gt;Nivel:&lt;/strong&gt; Principiante / Intermedio&lt;br&gt;
&lt;strong&gt;Tecnología:&lt;/strong&gt; React 18+&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="objetivos-de-aprendizaje" class="relative group"&gt;Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explicar qué es React y por qué se usa en el desarrollo web moderno&lt;/li&gt;
&lt;li&gt;Crear componentes funcionales propios con JSX&lt;/li&gt;
&lt;li&gt;Diferenciar entre props y state, y usar ambos correctamente&lt;/li&gt;
&lt;li&gt;Componer una interfaz de usuario a partir de múltiples componentes reutilizables&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="introducción" class="relative group"&gt;Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="qué-problema-resuelve-react" class="relative group"&gt;¿Qué problema resuelve React? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#qu%c3%a9-problema-resuelve-react" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Imagina que construyes una tienda en línea con HTML y JavaScript puro. Tienes un carrito de compras que muestra el número de artículos en la barra de navegación, en el ícono flotante y en la página de pago. Cada vez que el usuario agrega un producto, tienes que buscar manualmente esos tres elementos en el DOM y actualizarlos.&lt;/p&gt;</description></item><item><title>Introducción a React</title><link>https://fundacion-de-valores.github.io/software-development-platform/material-2/intro-react/</link><pubDate>Thu, 19 Feb 2026 08:33:57 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material-2/intro-react/</guid><description>&lt;h1 id="introducción-a-reactjs-con-vite" class="relative group"&gt;Introducción a ReactJS con Vite &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#introducci%c3%b3n-a-reactjs-con-vite" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Duración estimada:&lt;/strong&gt; 1 hora de estudio | &lt;strong&gt;Nivel:&lt;/strong&gt; Principiante / Intermedio&lt;br&gt;
&lt;strong&gt;Última actualización:&lt;/strong&gt; 2025 | React 18+ · Vite 5+&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="objetivos-de-aprendizaje" class="relative group"&gt;Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase, serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explicar qué es React y por qué se utiliza Vite como herramienta de construcción moderna&lt;/li&gt;
&lt;li&gt;Crear y configurar un proyecto React desde cero usando Vite&lt;/li&gt;
&lt;li&gt;Comprender y escribir componentes funcionales con JSX&lt;/li&gt;
&lt;li&gt;Manejar el estado local de un componente usando el Hook &lt;code&gt;useState&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pasar datos entre componentes mediante &lt;code&gt;props&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="introducción" class="relative group"&gt;Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="por-qué-aprender-react" class="relative group"&gt;¿Por qué aprender React? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#por-qu%c3%a9-aprender-react" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;El desarrollo web moderno exige interfaces dinámicas, rápidas y mantenibles. Construir una aplicación compleja con HTML y JavaScript puro se convierte rápidamente en un caos: código difícil de organizar, lógica mezclada con presentación y actualizaciones manuales del DOM.&lt;/p&gt;</description></item><item><title>Javascript APIs</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-apis/</link><pubDate>Mon, 19 Jan 2026 15:10:02 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-apis/</guid><description>&lt;h1 id="javascript--consumo-de-apis-con-fetch" class="relative group"&gt;JavaScript | Consumo de APIs con Fetch &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript--consumo-de-apis-con-fetch" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase, serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprender qué es una API REST y cómo funciona el protocolo HTTP&lt;/li&gt;
&lt;li&gt;Utilizar la Fetch API para realizar peticiones HTTP (GET, POST, PUT, DELETE)&lt;/li&gt;
&lt;li&gt;Trabajar con respuestas JSON: parseo, manipulación y validación de datos&lt;/li&gt;
&lt;li&gt;Manejar errores y estados de carga en peticiones asíncronas&lt;/li&gt;
&lt;li&gt;Aplicar buenas prácticas en el consumo de APIs externas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="por-qué-necesitamos-consumir-apis" class="relative group"&gt;¿Por qué necesitamos consumir APIs? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#por-qu%c3%a9-necesitamos-consumir-apis" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;En el desarrollo web moderno, las aplicaciones rara vez funcionan de manera aislada. Necesitamos obtener datos de servidores externos, enviar información de formularios, actualizar contenido sin recargar la página, o integrar servicios de terceros como mapas, pagos o autenticación.&lt;/p&gt;</description></item><item><title>Javascript Asincronia</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-asincronia/</link><pubDate>Mon, 19 Jan 2026 15:02:59 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-asincronia/</guid><description>&lt;h1 id="asincronía-en-javascript-callbacks-promesas-y-asyncawait" class="relative group"&gt;Asincronía en JavaScript: Callbacks, Promesas y Async/Await &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#asincron%c3%ada-en-javascript-callbacks-promesas-y-asyncawait" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender qué es la asincronía en JavaScript y por qué es fundamental en el desarrollo web&lt;/li&gt;
&lt;li&gt;Dominar los tres patrones principales para manejar código asíncrono: callbacks, promesas y async/await&lt;/li&gt;
&lt;li&gt;Implementar manejo de errores robusto en operaciones asíncronas usando try/catch&lt;/li&gt;
&lt;li&gt;Identificar cuándo usar cada patrón según el contexto y las necesidades del proyecto&lt;/li&gt;
&lt;li&gt;Escribir código asíncrono limpio, legible y mantenible siguiendo las mejores prácticas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Imagina que estás en una cafetería. Haces tu pedido y&amp;hellip; ¿te quedas parado bloqueando la fila esperando tu café? ¡No! Recibes un número, te apartas, y cuando tu pedido está listo te llaman. Mientras tanto, otros clientes pueden hacer sus pedidos.&lt;/p&gt;</description></item><item><title>Javascript Delegacion De Eventos</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-delegacion-de-eventos/</link><pubDate>Mon, 19 Jan 2026 14:46:19 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-delegacion-de-eventos/</guid><description>&lt;h1 id="javascript-manejo-del-dom--delegación-de-eventos" class="relative group"&gt;JavaScript: Manejo del DOM + Delegación de Eventos &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript-manejo-del-dom--delegaci%c3%b3n-de-eventos" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Dominar las técnicas principales de manipulación del DOM usando JavaScript moderno&lt;/li&gt;
&lt;li&gt;Comprender qué es la delegación de eventos y por qué es una técnica fundamental&lt;/li&gt;
&lt;li&gt;Implementar delegación de eventos para optimizar el rendimiento de aplicaciones web&lt;/li&gt;
&lt;li&gt;Identificar cuándo usar event listeners directos vs. delegación de eventos&lt;/li&gt;
&lt;li&gt;Aplicar buenas prácticas en la gestión de eventos del DOM&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Imagina que estás construyendo una lista de tareas (to-do list) con 100 elementos. ¿Añadirías 100 event listeners, uno para cada botón de &amp;ldquo;eliminar&amp;rdquo;? ¿Y si la lista crece dinámicamente? 🤔&lt;/p&gt;</description></item><item><title>Javascript Caracteristicas Modernas</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-caracteristicas-modernas/</link><pubDate>Mon, 19 Jan 2026 14:39:35 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-caracteristicas-modernas/</guid><description>&lt;h1 id="repaso-avanzado-de-javascript-características-modernas" class="relative group"&gt;Repaso Avanzado de JavaScript: Características Modernas &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#repaso-avanzado-de-javascript-caracter%c3%adsticas-modernas" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase, serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Desestructurar&lt;/strong&gt; objetos y arrays para extraer valores de manera eficiente y legible&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aplicar&lt;/strong&gt; los operadores spread y rest en diferentes contextos de programación&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crear&lt;/strong&gt; strings dinámicos utilizando template literals con expresiones embebidas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combinar&lt;/strong&gt; estas características para escribir código JavaScript más expresivo y mantenible&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identificar&lt;/strong&gt; casos de uso apropiados para cada una de estas características modernas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;¿Alguna vez te has encontrado escribiendo código repetitivo para extraer valores de objetos? ¿O concatenando strings con múltiples signos &lt;code&gt;+&lt;/code&gt; que hacen tu código difícil de leer?&lt;/p&gt;</description></item><item><title>Javascript Dom Eventos</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-dom-eventos/</link><pubDate>Tue, 13 Jan 2026 00:30:16 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-dom-eventos/</guid><description>&lt;h1 id="-eventos-en-el-dom-interactividad-en-javascript" class="relative group"&gt;🎪 Eventos en el DOM: Interactividad en JavaScript &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-eventos-en-el-dom-interactividad-en-javascript" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender qué son los eventos del DOM y cómo funcionan en el navegador&lt;/li&gt;
&lt;li&gt;Dominar las diferentes formas de asignar eventos a elementos HTML (onclick, addEventListener)&lt;/li&gt;
&lt;li&gt;Implementar los eventos más comunes (click, change, input, submit) en aplicaciones web reales&lt;/li&gt;
&lt;li&gt;Aplicar buenas prácticas para manejar eventos de forma eficiente y mantenible&lt;/li&gt;
&lt;li&gt;Prevenir comportamientos predeterminados y controlar la propagación de eventos&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Imagina una página web sin interactividad: no podrías hacer clic en botones, enviar formularios o ver notificaciones cuando algo cambia. Sería como un póster estático pegado en la pared. Los &lt;strong&gt;eventos del DOM&lt;/strong&gt; son el mecanismo que transforma documentos HTML estáticos en aplicaciones web dinámicas e interactivas.&lt;/p&gt;</description></item><item><title>Javascript Dom</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-dom/</link><pubDate>Tue, 13 Jan 2026 00:07:13 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-dom/</guid><description>&lt;h1 id="javascript-manipulación-del-dom" class="relative group"&gt;JavaScript: Manipulación del DOM &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript-manipulaci%c3%b3n-del-dom" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase, serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprender qué es el DOM y cómo representa la estructura de una página web como un árbol de nodos&lt;/li&gt;
&lt;li&gt;Seleccionar elementos del DOM utilizando diferentes métodos (&lt;code&gt;getElementById&lt;/code&gt;, &lt;code&gt;querySelector&lt;/code&gt;, &lt;code&gt;querySelectorAll&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Modificar el contenido de elementos usando &lt;code&gt;textContent&lt;/code&gt; e &lt;code&gt;innerHTML&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cambiar estilos dinámicamente mediante JavaScript&lt;/li&gt;
&lt;li&gt;Aplicar buenas prácticas en la manipulación del DOM para crear aplicaciones web interactivas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Cuando abres una página web, el navegador no solo muestra texto e imágenes. Detrás de escena, crea una representación estructurada de todo el documento HTML llamada &lt;strong&gt;DOM&lt;/strong&gt; (Document Object Model).&lt;/p&gt;</description></item><item><title>Javascript Metodos Array Objs</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-metodos-array-objs/</link><pubDate>Mon, 12 Jan 2026 23:44:16 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-metodos-array-objs/</guid><description>&lt;h1 id="javascript-métodos-y-funciones-con-arrays-y-objetos" class="relative group"&gt;JavaScript: Métodos y Funciones con Arrays y Objetos &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript-m%c3%a9todos-y-funciones-con-arrays-y-objetos" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender y aplicar los métodos modernos de arrays: &lt;code&gt;forEach&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;some&lt;/code&gt;, &lt;code&gt;every&lt;/code&gt;, y &lt;code&gt;reduce&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Diferenciar entre bucles tradicionales (&lt;code&gt;for&lt;/code&gt;) y métodos funcionales de arrays&lt;/li&gt;
&lt;li&gt;Crear funciones que reciban arrays y objetos como parámetros de forma eficiente&lt;/li&gt;
&lt;li&gt;Elegir el método más apropiado según el caso de uso específico&lt;/li&gt;
&lt;li&gt;Escribir código más limpio, legible y mantenible usando programación funcional&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Imagina que tienes una lista de 100 productos en tu tienda online y necesitas:&lt;/p&gt;</description></item><item><title>Javascript Objetos</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-objetos/</link><pubDate>Mon, 12 Jan 2026 23:29:59 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-objetos/</guid><description>&lt;h1 id="javascript-objetos---guía-completa" class="relative group"&gt;JavaScript: Objetos - Guía Completa &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript-objetos---gu%c3%ada-completa" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear objetos en JavaScript utilizando la sintaxis literal correcta&lt;/li&gt;
&lt;li&gt;Acceder a las propiedades de un objeto usando notación de punto y corchetes&lt;/li&gt;
&lt;li&gt;Modificar, agregar y eliminar propiedades de objetos dinámicamente&lt;/li&gt;
&lt;li&gt;Trabajar con estructuras de datos complejas: objetos dentro de arrays y arrays dentro de objetos&lt;/li&gt;
&lt;li&gt;Aplicar buenas prácticas en la manipulación de objetos para escribir código profesional&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Imagina que necesitas representar información sobre un estudiante en tu aplicación. Podrías usar variables separadas: &lt;code&gt;nombre&lt;/code&gt;, &lt;code&gt;edad&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;&amp;hellip; pero ¿qué pasa cuando tienes 100 estudiantes? Los &lt;strong&gt;objetos&lt;/strong&gt; son la solución.&lt;/p&gt;</description></item><item><title>Javascript Arrays</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-arrays/</link><pubDate>Mon, 12 Jan 2026 23:28:29 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-arrays/</guid><description>&lt;h1 id="javascript-arrays-y-sus-métodos-básicos" class="relative group"&gt;JavaScript: Arrays y sus Métodos Básicos &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript-arrays-y-sus-m%c3%a9todos-b%c3%a1sicos" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender qué son los arrays y cuándo utilizarlos en JavaScript&lt;/li&gt;
&lt;li&gt;Dominar los métodos básicos de manipulación: &lt;code&gt;push()&lt;/code&gt;, &lt;code&gt;pop()&lt;/code&gt;, &lt;code&gt;unshift()&lt;/code&gt;, &lt;code&gt;shift()&lt;/code&gt; y la propiedad &lt;code&gt;length&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Implementar bucles &lt;code&gt;for&lt;/code&gt; y &lt;code&gt;for...of&lt;/code&gt; para recorrer arrays eficientemente&lt;/li&gt;
&lt;li&gt;Identificar cuándo usar cada método según el caso de uso&lt;/li&gt;
&lt;li&gt;Aplicar estos conceptos en situaciones reales de desarrollo web&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Imagina que necesitas gestionar una lista de tareas pendientes, almacenar los nombres de usuarios registrados en tu aplicación, o guardar los productos de un carrito de compras. ¿Cómo organizarías esta información?&lt;/p&gt;</description></item><item><title>Javascript Funciones</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-funciones/</link><pubDate>Mon, 12 Jan 2026 07:43:54 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-funciones/</guid><description>&lt;h1 id="javascript-básico-funciones" class="relative group"&gt;JavaScript Básico: Funciones &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript-b%c3%a1sico-funciones" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender qué son las funciones y por qué son fundamentales en JavaScript&lt;/li&gt;
&lt;li&gt;Dominar las diferentes formas de declarar y utilizar funciones&lt;/li&gt;
&lt;li&gt;Aplicar parámetros, argumentos y valores de retorno correctamente&lt;/li&gt;
&lt;li&gt;Identificar y utilizar el scope (ámbito) de las variables en funciones&lt;/li&gt;
&lt;li&gt;Implementar funciones de flecha (arrow functions) y entender sus diferencias&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Las funciones son uno de los bloques de construcción más importantes en JavaScript. Imagina que estás escribiendo las instrucciones para hacer un sándwich: podrías escribir cada paso cada vez que quieras hacer uno, o podrías crear una &amp;ldquo;receta&amp;rdquo; que puedas usar una y otra vez. Las funciones son exactamente eso: &lt;strong&gt;recetas de código reutilizable&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Javascript Estructuras De Control</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-estructuras-de-control/</link><pubDate>Mon, 12 Jan 2026 07:20:41 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-estructuras-de-control/</guid><description>&lt;h1 id="javascript-básico-estructuras-de-control" class="relative group"&gt;JavaScript Básico: Estructuras de Control &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript-b%c3%a1sico-estructuras-de-control" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender qué son las estructuras de control y por qué son fundamentales en programación&lt;/li&gt;
&lt;li&gt;Dominar el uso de condicionales (&lt;code&gt;if&lt;/code&gt;, &lt;code&gt;else&lt;/code&gt;, &lt;code&gt;else if&lt;/code&gt;, &lt;code&gt;switch&lt;/code&gt;) para tomar decisiones en tu código&lt;/li&gt;
&lt;li&gt;Implementar bucles (&lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, &lt;code&gt;do-while&lt;/code&gt;) para ejecutar código repetitivo de manera eficiente&lt;/li&gt;
&lt;li&gt;Aplicar &lt;code&gt;break&lt;/code&gt; y &lt;code&gt;continue&lt;/code&gt; para controlar el flujo dentro de bucles&lt;/li&gt;
&lt;li&gt;Escribir código más limpio y mantenible utilizando las estructuras de control apropiadas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Imagina que estás siguiendo una receta de cocina. A veces necesitas tomar decisiones: &amp;ldquo;&lt;strong&gt;Si&lt;/strong&gt; tengo azúcar morena, úsala; &lt;strong&gt;sino&lt;/strong&gt;, usa azúcar blanca&amp;rdquo;. Otras veces necesitas repetir acciones: &amp;ldquo;Bate la mezcla &lt;strong&gt;mientras&lt;/strong&gt; tenga grumos&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Javascript Variables Datos</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-variables-datos/</link><pubDate>Mon, 12 Jan 2026 07:12:22 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/javascript-variables-datos/</guid><description>&lt;h1 id="javascript-básico-variables-comentarios-tipos-de-datos-primitivos-y-operadores" class="relative group"&gt;JavaScript Básico: Variables, Comentarios, Tipos de Datos Primitivos y Operadores &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#javascript-b%c3%a1sico-variables-comentarios-tipos-de-datos-primitivos-y-operadores" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Declarar y utilizar variables en JavaScript usando &lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt; y &lt;code&gt;const&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Identificar y trabajar con los 7 tipos de datos primitivos de JavaScript&lt;/li&gt;
&lt;li&gt;Aplicar operadores aritméticos, de comparación y lógicos para resolver problemas&lt;/li&gt;
&lt;li&gt;Escribir comentarios efectivos que mejoren la legibilidad del código&lt;/li&gt;
&lt;li&gt;Comprender las diferencias entre igualdad estricta (&lt;code&gt;===&lt;/code&gt;) e igualdad débil (&lt;code&gt;==&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;JavaScript es el lenguaje de programación que da vida a las páginas web. Mientras HTML define la estructura y CSS el estilo, JavaScript proporciona la interactividad: desde validar formularios hasta crear aplicaciones web complejas.&lt;/p&gt;</description></item><item><title>Tailwind Base</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-base/</link><pubDate>Wed, 07 Jan 2026 23:25:39 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-base/</guid><description>&lt;h1 id="tailwind-css---propiedades-básicas" class="relative group"&gt;Tailwind CSS - Propiedades Básicas &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#tailwind-css---propiedades-b%c3%a1sicas" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender la filosofía utility-first de Tailwind CSS y sus ventajas&lt;/li&gt;
&lt;li&gt;Dominar las clases básicas para espaciado, tamaños y colores&lt;/li&gt;
&lt;li&gt;Aplicar tipografía, flexbox y grid de forma efectiva con utilidades de Tailwind&lt;/li&gt;
&lt;li&gt;Crear diseños responsivos usando los modificadores de breakpoint&lt;/li&gt;
&lt;li&gt;Implementar estados interactivos (hover, focus, active) con clases predefinidas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="qué-es-tailwind-css" class="relative group"&gt;¿Qué es Tailwind CSS? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#qu%c3%a9-es-tailwind-css" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Tailwind CSS es un framework de CSS basado en &lt;strong&gt;utilidades&lt;/strong&gt; (utility-first) que te permite construir interfaces modernas sin salir de tu HTML. En lugar de escribir CSS personalizado, aplicas clases predefinidas que representan propiedades específicas.&lt;/p&gt;</description></item><item><title>Tailwind Darkmode</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-darkmode/</link><pubDate>Wed, 07 Jan 2026 23:08:33 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-darkmode/</guid><description>&lt;h1 id="tailwind-css---dark-mode" class="relative group"&gt;Tailwind CSS - Dark Mode &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#tailwind-css---dark-mode" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Implementar el modo oscuro en aplicaciones web usando la clase &lt;code&gt;dark:&lt;/code&gt; de Tailwind CSS&lt;/li&gt;
&lt;li&gt;Configurar diferentes estrategias de activación del dark mode (manual, sistema, clase)&lt;/li&gt;
&lt;li&gt;Aplicar variantes de color responsivas que se adapten al tema claro y oscuro&lt;/li&gt;
&lt;li&gt;Crear interfaces accesibles que respeten las preferencias del usuario&lt;/li&gt;
&lt;li&gt;Optimizar la experiencia de usuario mediante transiciones suaves entre temas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="por-qué-es-importante-el-dark-mode" class="relative group"&gt;¿Por qué es importante el Dark Mode? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#por-qu%c3%a9-es-importante-el-dark-mode" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;El modo oscuro se ha convertido en una característica esencial de las aplicaciones modernas. Según estudios recientes, más del 80% de los usuarios prefieren interfaces oscuras en condiciones de baja luminosidad.&lt;/p&gt;</description></item><item><title>Tailwind Diseño Responsivo</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-dise%C3%B1o-responsivo/</link><pubDate>Wed, 07 Jan 2026 23:06:10 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-dise%C3%B1o-responsivo/</guid><description>&lt;h1 id="tailwind-css---responsive-design" class="relative group"&gt;Tailwind CSS - Responsive Design &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#tailwind-css---responsive-design" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender el sistema de breakpoints de Tailwind CSS y cómo aplicar estilos responsive&lt;/li&gt;
&lt;li&gt;Dominar el enfoque mobile-first para crear interfaces adaptables&lt;/li&gt;
&lt;li&gt;Implementar layouts responsivos utilizando utilidades de Tailwind&lt;/li&gt;
&lt;li&gt;Aplicar técnicas avanzadas como mostrar/ocultar elementos y cambiar tamaños según el dispositivo&lt;/li&gt;
&lt;li&gt;Optimizar la experiencia de usuario en diferentes tamaños de pantalla&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;En la actualidad, más del 60% del tráfico web proviene de dispositivos móviles. Crear sitios web que se vean bien en cualquier pantalla ya no es opcional: es esencial.&lt;/p&gt;</description></item><item><title>Tailwind Estados Interactivos</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-estados-interactivos/</link><pubDate>Wed, 07 Jan 2026 22:50:36 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-estados-interactivos/</guid><description>&lt;h1 id="tailwind-css-estados-interactivos-hover-active-focus-focus-within" class="relative group"&gt;Tailwind CSS: Estados Interactivos (hover, active, focus, focus-within) &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#tailwind-css-estados-interactivos-hover-active-focus-focus-within" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender cómo funcionan los modificadores de estado en Tailwind CSS&lt;/li&gt;
&lt;li&gt;Aplicar estilos interactivos con &lt;code&gt;hover&lt;/code&gt;, &lt;code&gt;active&lt;/code&gt;, &lt;code&gt;focus&lt;/code&gt; y &lt;code&gt;focus-within&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Combinar múltiples estados para crear interfaces de usuario dinámicas&lt;/li&gt;
&lt;li&gt;Implementar patrones de accesibilidad utilizando estados de enfoque&lt;/li&gt;
&lt;li&gt;Optimizar la experiencia de usuario mediante feedback visual interactivo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="por-qué-son-importantes-los-estados-interactivos" class="relative group"&gt;¿Por qué son importantes los estados interactivos? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#por-qu%c3%a9-son-importantes-los-estados-interactivos" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Los usuarios modernos esperan que las interfaces web respondan a sus acciones. Cuando pasas el cursor sobre un botón, esperas algún tipo de feedback visual. Cuando un campo de formulario está enfocado, debe indicarte claramente dónde estás escribiendo.&lt;/p&gt;</description></item><item><title>Tailwind Introducción</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-intro/</link><pubDate>Wed, 07 Jan 2026 22:19:52 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/tailwind-intro/</guid><description>&lt;h1 id="introducción-a-tailwind-css" class="relative group"&gt;Introducción a Tailwind CSS &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#introducci%c3%b3n-a-tailwind-css" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender qué es Tailwind CSS y cómo difiere de otros frameworks CSS tradicionales&lt;/li&gt;
&lt;li&gt;Instalar y configurar Tailwind CSS en un proyecto web&lt;/li&gt;
&lt;li&gt;Aplicar clases utilitarias para crear diseños responsivos sin escribir CSS personalizado&lt;/li&gt;
&lt;li&gt;Implementar los principios de diseño utility-first para construir interfaces modernas&lt;/li&gt;
&lt;li&gt;Desarrollar componentes reutilizables utilizando las clases predefinidas de Tailwind&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="qué-es-tailwind-css" class="relative group"&gt;¿Qué es Tailwind CSS? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#qu%c3%a9-es-tailwind-css" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Tailwind CSS es un framework de CSS de tipo &lt;strong&gt;utility-first&lt;/strong&gt; (utilidades primero) que te permite construir interfaces de usuario modernas directamente en tu HTML. A diferencia de frameworks como Bootstrap o Foundation que proporcionan componentes prediseñados, Tailwind te da clases utilitarias de bajo nivel que funcionan como bloques de construcción.&lt;/p&gt;</description></item><item><title>Flex Y Grid</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/flex-y-grid/</link><pubDate>Thu, 11 Dec 2025 14:53:06 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/flex-y-grid/</guid><description>&lt;h1 id="css-flexbox-y-grid-layout" class="relative group"&gt;CSS: Flexbox y Grid Layout &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#css-flexbox-y-grid-layout" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender cuándo usar Flexbox vs Grid y sus casos de uso ideales&lt;/li&gt;
&lt;li&gt;Dominar las propiedades fundamentales de Flexbox para layouts unidimensionales&lt;/li&gt;
&lt;li&gt;Crear layouts bidimensionales complejos usando CSS Grid&lt;/li&gt;
&lt;li&gt;Aplicar técnicas de alineación y distribución de espacio en ambos sistemas&lt;/li&gt;
&lt;li&gt;Desarrollar layouts responsivos modernos combinando ambas herramientas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Durante años, los desarrolladores web tuvimos que usar &amp;ldquo;hacks&amp;rdquo; con floats, tablas y positioning para crear layouts. Esto era frustrante, poco intuitivo y difícil de mantener.&lt;/p&gt;</description></item><item><title>Position Css</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/position-css/</link><pubDate>Thu, 11 Dec 2025 14:47:30 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/position-css/</guid><description>&lt;h1 id="css-position---controlando-el-flujo-de-elementos" class="relative group"&gt;CSS: Position - Controlando el Flujo de Elementos &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#css-position---controlando-el-flujo-de-elementos" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprender cómo funciona el flujo normal de documento y cómo &lt;code&gt;position&lt;/code&gt; lo altera&lt;/li&gt;
&lt;li&gt;Diferenciar y aplicar correctamente los cinco valores de &lt;code&gt;position&lt;/code&gt;: static, relative, absolute, fixed y sticky&lt;/li&gt;
&lt;li&gt;Utilizar las propiedades de desplazamiento (top, right, bottom, left) junto con position&lt;/li&gt;
&lt;li&gt;Crear layouts complejos combinando diferentes tipos de posicionamiento&lt;/li&gt;
&lt;li&gt;Identificar y resolver problemas comunes relacionados con el posicionamiento de elementos&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="por-qué-es-importante-position" class="relative group"&gt;¿Por qué es importante position? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#por-qu%c3%a9-es-importante-position" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Imagina que estás organizando muebles en una habitación. Por defecto, los colocas uno tras otro siguiendo un orden natural. Pero a veces necesitas:&lt;/p&gt;</description></item><item><title>Box Model</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/box-model/</link><pubDate>Thu, 11 Dec 2025 14:31:17 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/box-model/</guid><description>&lt;h1 id="box-model-css-la-base-del-layout-web" class="relative group"&gt;Box Model CSS: La Base del Layout Web &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#box-model-css-la-base-del-layout-web" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Al finalizar esta clase, serás capaz de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprender la estructura completa del Box Model y cómo cada componente afecta el tamaño final de los elementos&lt;/li&gt;
&lt;li&gt;Aplicar correctamente &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt; y &lt;code&gt;content&lt;/code&gt; para controlar el espaciado&lt;/li&gt;
&lt;li&gt;Diferenciar entre &lt;code&gt;box-sizing: content-box&lt;/code&gt; y &lt;code&gt;box-sizing: border-box&lt;/code&gt; y elegir el más apropiado&lt;/li&gt;
&lt;li&gt;Diagnosticar y resolver problemas comunes de espaciado y dimensionamiento&lt;/li&gt;
&lt;li&gt;Utilizar las DevTools del navegador para inspeccionar y depurar el Box Model&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="por-qué-es-importante-el-box-model" class="relative group"&gt;¿Por qué es importante el Box Model? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#por-qu%c3%a9-es-importante-el-box-model" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Imagina que estás organizando muebles en una habitación. Necesitas saber no solo el tamaño del mueble, sino también cuánto espacio hay alrededor de él y si tiene un marco decorativo. &lt;strong&gt;El Box Model CSS funciona exactamente igual&lt;/strong&gt;: cada elemento HTML es una &amp;ldquo;caja&amp;rdquo; con múltiples capas que determinan su espacio total.&lt;/p&gt;</description></item><item><title>Etiquetas Contenedoras</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/etiquetas-contenedoras/</link><pubDate>Thu, 11 Dec 2025 13:55:21 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/etiquetas-contenedoras/</guid><description>&lt;h1 id="etiquetas-contenedoras-html" class="relative group"&gt;Etiquetas Contenedoras HTML &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#etiquetas-contenedoras-html" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Comprender qué son las etiquetas contenedoras y su función en la estructura HTML&lt;/li&gt;
&lt;li&gt;Identificar y utilizar correctamente las principales etiquetas contenedoras semánticas&lt;/li&gt;
&lt;li&gt;Aplicar la jerarquía correcta de contenedores para crear layouts bien estructurados&lt;/li&gt;
&lt;li&gt;Diferenciar entre etiquetas contenedoras genéricas y semánticas&lt;/li&gt;
&lt;li&gt;Implementar una arquitectura HTML accesible y mantenible usando contenedores apropiados&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="por-qué-son-importantes-las-etiquetas-contenedoras" class="relative group"&gt;¿Por qué son importantes las etiquetas contenedoras? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#por-qu%c3%a9-son-importantes-las-etiquetas-contenedoras" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Imagina que estás organizando una biblioteca. No simplemente apilas todos los libros en el suelo, ¿verdad? Los organizas en estanterías, secciones, y categorías. Las etiquetas contenedoras hacen exactamente eso con el contenido web.&lt;/p&gt;</description></item><item><title>Formularios Y Tablas</title><link>https://fundacion-de-valores.github.io/software-development-platform/material/formularios-y-tablas/</link><pubDate>Wed, 10 Dec 2025 11:00:32 -0500</pubDate><guid>https://fundacion-de-valores.github.io/software-development-platform/material/formularios-y-tablas/</guid><description>&lt;h1 id="formularios-y-tablas-html" class="relative group"&gt;Formularios y Tablas HTML &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#formularios-y-tablas-html" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h2 id="-objetivos-de-aprendizaje" class="relative group"&gt;📋 Objetivos de aprendizaje &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-objetivos-de-aprendizaje" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Crear formularios HTML completos con diferentes tipos de campos de entrada&lt;/li&gt;
&lt;li&gt;Estructurar datos tabulares de manera semántica usando elementos de tabla&lt;/li&gt;
&lt;li&gt;Implementar validación básica de formularios y atributos de accesibilidad&lt;/li&gt;
&lt;li&gt;Aplicar buenas prácticas para mejorar la experiencia de usuario en formularios&lt;/li&gt;
&lt;li&gt;Comprender la diferencia entre presentación visual y estructura semántica de datos&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-introducción" class="relative group"&gt;🎯 Introducción &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-introducci%c3%b3n" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Los formularios y tablas son dos de los componentes más importantes en el desarrollo web. Los &lt;strong&gt;formularios&lt;/strong&gt; son el puente de comunicación entre el usuario y tu aplicación: permiten recopilar información, realizar búsquedas, registrar usuarios, procesar pagos y mucho más. Por otro lado, las &lt;strong&gt;tablas&lt;/strong&gt; son la forma correcta de presentar datos estructurados en filas y columnas.&lt;/p&gt;</description></item></channel></rss>