`.
diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/redux/write-a-counter-with-redux.md b/curriculum/challenges/espanol/03-front-end-development-libraries/redux/write-a-counter-with-redux.md
index 2290a4ec4e2..8cf7bb6cf9b 100644
--- a/curriculum/challenges/espanol/03-front-end-development-libraries/redux/write-a-counter-with-redux.md
+++ b/curriculum/challenges/espanol/03-front-end-development-libraries/redux/write-a-counter-with-redux.md
@@ -8,7 +8,7 @@ dashedName: write-a-counter-with-redux
# --description--
-¡Ahora ya has aprendido todos los principios básicos de Redux! Has visto cómo crear acciones y creadores de acción, crear un almacén Redux, enviar tus acciones contra el almacén y diseñar actualizaciones de estado con reductores puros. Incluso has visto cómo gestionar estados complejos con la composición de reductores y manejar acciones asíncronas. Estos ejemplos son simplistas, pero estos conceptos son los principios básicos de Redux. Si los entiendes bien, estás listo para empezar a construir tu propia aplicación Redux. Los próximos desafíos cubren algunos de los detalles relacionados con la inmutabilidad de `state`, pero primero, aquí hay un repaso de todo lo que has aprendido hasta ahora.
+¡Ahora ya has aprendido todos los principios básicos de Redux! Has visto cómo crear acciones y creadores de acción, crear un almacén Redux, enviar tus acciones contra el almacén y diseñar actualizaciones de estado con reductores puros. Incluso has visto cómo gestionar estados complejos con la composición de reductores y manejar acciones asíncronas. Estos ejemplos son simplistas, pero estos conceptos son los principios básicos de Redux. Si los entiendes bien, estás listo para empezar a crear tu propia aplicación Redux. Los próximos desafíos cubren algunos de los detalles relacionados con la inmutabilidad de `state`, pero primero, aquí hay un repaso de todo lo que has aprendido hasta ahora.
# --instructions--
diff --git a/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-choropleth-map.md b/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-choropleth-map.md
index 85187c21e15..09a430de972 100644
--- a/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-choropleth-map.md
+++ b/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-choropleth-map.md
@@ -8,7 +8,7 @@ dashedName: visualize-data-with-a-choropleth-map
# --description--
-**Objetivo:** Crear una aplicación que sea funcionalmente similar a esta
https://codepen.io/freeCodeCamp/full/EZKqza .
+**Objetivo:** Crea una aplicación que sea funcionalmente similar a esta
https://codepen.io/freeCodeCamp/full/EZKqza .
Completa las historias de usuario a continuación y obtén todas las pruebas para aprobar. Utiliza cualquier librería o API que necesites. Dale tu propio estilo.
diff --git a/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-heat-map.md b/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-heat-map.md
index 0234b105b00..c341e71bfef 100644
--- a/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-heat-map.md
+++ b/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-heat-map.md
@@ -8,7 +8,7 @@ dashedName: visualize-data-with-a-heat-map
# --description--
-**Objetivo:** Crear una aplicación que sea funcionalmente similar a
https://codepen.io/freeCodeCamp/full/JEXgeY .
+**Objetivo:** Crea una aplicación que sea funcionalmente similar a
https://codepen.io/freeCodeCamp/full/JEXgeY .
Completa las historias de usuario a continuación y obtén todas las pruebas para aprobar. Utiliza cualquier librería o API que necesites. Dale tu propio estilo.
diff --git a/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-scatterplot-graph.md b/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-scatterplot-graph.md
index b2ae46d039c..df1a789b128 100644
--- a/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-scatterplot-graph.md
+++ b/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-scatterplot-graph.md
@@ -8,7 +8,7 @@ dashedName: visualize-data-with-a-scatterplot-graph
# --description--
-**Objetivo:** Crear una aplicación que sea funcionalmente similar a
https://codepen.io/freeCodeCamp/full/bgpXyK .
+**Objetivo:** Crea una aplicación que sea funcionalmente similar a
https://codepen.io/freeCodeCamp/full/bgpXyK .
Completa las historias de usuario a continuación y obtén todas las pruebas para aprobar. Utiliza cualquier librería o API que necesites. Dale tu propio estilo.
diff --git a/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-treemap-diagram.md b/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-treemap-diagram.md
index 9f8181e9aef..b904883101b 100644
--- a/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-treemap-diagram.md
+++ b/curriculum/challenges/espanol/04-data-visualization/data-visualization-projects/visualize-data-with-a-treemap-diagram.md
@@ -8,7 +8,7 @@ dashedName: visualize-data-with-a-treemap-diagram
# --description--
-**Objetivo:** Crear una aplicación que sea funcionalmente similar a
https://codepen.io/freeCodeCamp/full/KaNGNR .
+**Objetivo:** Crea una aplicación que sea funcionalmente similar a
https://codepen.io/freeCodeCamp/full/KaNGNR .
Completa las historias de usuario a continuación y obtén todas las pruebas para aprobar. Utiliza cualquier librería o API que necesites. Dale tu propio estilo.
diff --git a/curriculum/challenges/espanol/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md b/curriculum/challenges/espanol/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md
index 0274efdcc1e..74abfbde8b6 100644
--- a/curriculum/challenges/espanol/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md
+++ b/curriculum/challenges/espanol/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md
@@ -1,6 +1,6 @@
---
id: 5f87ac112ae598023a42df1a
-title: Construye un Planificador de Citas de Salón
+title: Crea un planificador de citas de salón
challengeType: 13
helpCategory: Backend Development
url: https://github.com/freeCodeCamp/learn-salon-appointment-scheduler
diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md
index 6ec9f38a4c3..a04e16186ac 100644
--- a/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md
+++ b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md
@@ -8,7 +8,7 @@ dashedName: build-a-personal-portfolio-webpage
# --description--
-**Objetivo:**Crea una aplicación que sea funcionalmente similar a
https://personal-portfolio.freecodecamp.rocks
+**Objetivo:** Crea una aplicación que sea funcionalmente similar a
https://personal-portfolio.freecodecamp.rocks
**Historias de usuario:**
@@ -172,11 +172,11 @@ Tu elemento `#navbar` siempre debe estar en la parte superior del viewport.
-
+
Personal Portfolio
-
+
Projects |
diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md
new file mode 100644
index 00000000000..6e6c8dba4ea
--- /dev/null
+++ b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md
@@ -0,0 +1,467 @@
+---
+id: 587d78af367417b2b2512b04
+title: Construye una página de inicio de producto
+challengeType: 14
+forumTopicId: 301144
+dashedName: build-a-product-landing-page
+---
+
+# --description--
+
+**Objetivo:** Crea una aplicación que sea funcionalmente similar a https://product-landing-page.freecodecamp.rocks
+
+**Historias de usuario:**
+
+1. Tu página de inicio de producto debe tener un elemento `header` con un correspondiente `id="header"`
+1. Puedes ver una imagen dentro del elemento `header` con un correspondiente `id="header-img"` (Un logotipo sería una buena imagen aquí)
+1. Dentro el elemento `#header`, puedes ver un elemento `nav` con su correspondiente `id="nav-bar"`
+1. Puedes ver al menos tres elementos cliqueables dentro del elemento `nav`, cafda una con la clase `nav-link`
+1. Cuando hagas click en un botón `.nav-link` en el elemento `nav`, serás redireccionado a la sección correspondiente de la página de inicio
+1. Puedes ver un vídeo del producto incrustado con `id="video"`
+1. Tu página de inicio tiene un elemento `form` con un correspondiente `id="form"`
+1. Dentro del formulario, hay un campo `input` con `id="email"`, donde puedes ingresar tu dirección de email
+1. El campo de entrada `#email` debe tener un marcador de texto para que los usuarios sepan para que sirve este campo
+1. El campo de entrada `#email` usa validación HTML5 para confirmar que el texto ingresado es una dirección de email
+1. Dentro del formulario, hay un `input` de tipo submit (enviar) con su correspondiente `id="submit"`
+1. Cuendo haces click en el elemento `#submit`, el email es enviado a una página web (Utiliza esta URL de pruebas: `https://www.freecodecamp.com/email-submit`)
+1. La barra de navegación siempre debe estar en la parte superior de la vista
+1. La página de inicio de tu producto debe tener al menos una consulta de medios
+1. Tu página de inicio del producto debe utillizar el flexbox CSS al menos una vez
+
+Completa las instrucciones y pasa todas las pruebas a continuación para completar este proyecto. Dale tu propio estilo estilo personal. ¡Feliz día programando!
+
+**Nota:** Asegúrate de agregar ` ` en tu HTML para enlazar tu hoja de estilos y aplicar tu CSS
+
+# --hints--
+
+Debes tener un elemento `header` con un `id` de `header`.
+
+```js
+const el = document.getElementById('header')
+assert(!!el && el.tagName === 'HEADER')
+```
+
+Debes tener un elemento `img` con un `id` de `header-img`.
+
+```js
+const el = document.getElementById('header-img')
+assert(!!el && el.tagName === 'IMG')
+```
+
+Tu `#header-img` debe ser descendiente de `#header`.
+
+```js
+const els = document.querySelectorAll('#header #header-img')
+assert(els.length > 0)
+```
+
+Tu `#header-img` debe tener un atributo `src`.
+
+```js
+const el = document.getElementById('header-img')
+assert(!!el && !!el.src)
+```
+
+El valor del `src` de `#header-img` debe ser una URL válida (inicia con `http`).
+
+```js
+const el = document.getElementById('header-img')
+assert(!!el && /^http/.test(el.src))
+```
+
+Debes tener un elemento `nav` con un `id` de `nav-bar`.
+
+```js
+const el = document.getElementById('nav-bar')
+assert(!!el && el.tagName === 'NAV')
+```
+
+Tu `#nav-bar` debe ser descendiente de `#header`.
+
+```js
+const els = document.querySelectorAll('#header #nav-bar')
+assert(els.length > 0)
+```
+
+Debes tener al menos 3 elementos `.nav-link` dentro del `#nav-bar`.
+
+```js
+const els = document.querySelectorAll('#nav-bar .nav-link')
+assert(els.length >= 3)
+```
+
+Cada elemento `.nav-link` debe tener un atributo `href`.
+
+```js
+const els = document.querySelectorAll('.nav-link')
+els.forEach(el => {
+ if (!el.href) assert(false)
+})
+assert(els.length > 0)
+```
+
+Cada elemento `.nav-link` debe estar enlazado a su elemento correspondiente en la página de aterrizaje (el valor que tiene el `href` es el id de otro elemento, por ejemplo, `#footer`).
+
+```js
+const els = document.querySelectorAll('.nav-link')
+els.forEach(el => {
+ const linkDestination = el.getAttribute('href').slice(1)
+ if (!document.getElementById(linkDestination)) assert(false)
+})
+assert(els.length > 0)
+```
+
+Debes tener un elemento `video` o `iframe` con un `id` de `video`.
+
+```js
+const el = document.getElementById('video')
+assert(!!el && (el.tagName === 'VIDEO' || el.tagName === 'IFRAME'))
+```
+
+Tu `#video` debe tener un atributo `src`.
+
+```js
+let el = document.getElementById('video')
+const sourceNode = el.children;
+let sourceElement = null;
+if (sourceNode.length) {
+ sourceElement = [...video.children].filter(el => el.localName === 'source')[0];
+}
+if (sourceElement) {
+ el = sourceElement;
+}
+assert(el.hasAttribute('src'));
+```
+
+Debes tener un elemento `form` con un `id` de `form`.
+
+```js
+const el = document.getElementById('form')
+assert(!!el && el.tagName === 'FORM')
+```
+
+Debes tener un elemento `input` con un `id` de `email`.
+
+```js
+const el = document.getElementById('email')
+assert(!!el && el.tagName === 'INPUT')
+```
+
+Tu `#email` debe ser descendiente de `#form`.
+
+```js
+const els = document.querySelectorAll('#form #email')
+assert(els.length > 0)
+```
+
+Tu `#email` debe tener el atributo `placeholder` con un texto marcador de posición.
+
+```js
+const el = document.getElementById('email')
+assert(!!el && !!el.placeholder && el.placeholder.length > 0)
+```
+
+Tu `#email` debe usar la validación HTML5 estableciendo su `type` a `email`.
+
+```js
+const el = document.getElementById('email')
+assert(!!el && el.type === 'email')
+```
+
+Debes tener un elemento `input` con un `id` de `submit`.
+
+```js
+const el = document.getElementById('submit')
+assert(!!el && el.tagName === 'INPUT')
+```
+
+Tu `#submit` debe ser descendiente de `#form`.
+
+```js
+const els = document.querySelectorAll('#form #submit')
+assert(els.length > 0)
+```
+
+Tu `#submit` debe tener un `type` de `submit`.
+
+```js
+const el = document.getElementById('submit')
+assert(!!el && el.type === 'submit')
+```
+
+Tu `#form` debe tener un atributo `action` de `https://www.freecodecamp.com/email-submit`.
+
+```js
+const el = document.getElementById('form')
+assert(!!el && el.action === 'https://www.freecodecamp.com/email-submit')
+```
+
+Tu `#email` debe tener un atributo `name` de `email`.
+
+```js
+const el = document.getElementById('email')
+assert(!!el && el.name === 'email')
+```
+
+Tu `#nav-bar` siempre debe estar en la parte superior de la ventana gráfica.
+
+```js
+(async () => {
+ const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
+
+ const header = document.getElementById('header');
+ const headerChildren = header.children;
+ const navbarCandidates = [header, ...headerChildren];
+
+ // Return smallest top position of all navbar candidates
+ const getNavbarPosition = (candidates = []) => {
+ return candidates.reduce(
+ (min, candidate) =>
+ Math.min(min, Math.abs(candidate?.getBoundingClientRect().top)),
+ Infinity
+ );
+ };
+ assert.approximately(
+ getNavbarPosition(navbarCandidates),
+ 0,
+ 15,
+ '#header or one of its children should be at the top of the viewport '
+ );
+
+ window.scroll(0, 500);
+ await timeout(1);
+
+ assert.approximately(
+ getNavbarPosition(navbarCandidates),
+ 0,
+ 15,
+ '#header or one of its children should be at the top of the ' +
+ 'viewport even after scrolling '
+ );
+
+ window.scroll(0, 0);
+})();
+```
+
+Tu página de aterrizaje de un producto debe usar por lo menos una consulta de medios.
+
+```js
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
+```
+
+Tu página de aterrizaje de un producto debe usar CSS Flexbox por lo menos una vez.
+
+```js
+const stylesheet = new __helpers.CSSHelp(document).getStyleSheet()
+const cssRules = new __helpers.CSSHelp(document).styleSheetToCssRulesArray(stylesheet)
+const usesFlex = cssRules.find(rule => {
+ return rule.style?.display === 'flex' || rule.style?.display === 'inline-flex'
+})
+assert(usesFlex)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+```
+
+```css
+
+```
+
+## --solutions--
+
+```html
+
+
+
+
+
+ Product Landing Page
+
+
+
+
+
+ Pokemon Daycare Service
+
+
+ What we offer
+
+
+
+
+
Guaranteed friendly and loving staff!
+
+
+
+
+
+
+ Comfortable environment for Pokemon to explore and play!
+
+
+
+
+
+
+
+ Multiple membership plans to fit your lifestyle!
+
+
+
+
+ Check us out!
+ A sneak peek into our facility:
+
+ VIDEO
+
+
+ Membership Plans
+
+
+
Basic Membership
+
+ One Pokemon
+ Food and berries provided
+
+
$9.99/month
+
+
+
Silver Membership
+
+ Up to Three Pokemon
+ Food and berries provided
+ Grooming and accessories included
+
+
$19.99/month
+
+
+
Gold Membership
+
+ Up to six Pokemon!
+ Food and berries provided
+ Grooming and accessories included
+ Personal training for each Pokemon
+ Breeding and egg hatching
+
+
$29.99/month
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: #3a3240;
+ color: white;
+}
+main {
+ max-width: 750px;
+ margin: 50px auto;
+}
+input {
+ background-color: #92869c;
+}
+a:not(.nav-link) {
+ color: white;
+}
+#header-img {
+ max-height: 25px;
+}
+#nav-bar {
+ position: fixed;
+ width: 100%;
+ text-align: center;
+ top: 0%;
+ background-color: #92869c;
+}
+h1 {
+ text-align: center;
+}
+body {
+ text-align: center;
+}
+footer {
+ text-align: center;
+}
+#bullet {
+ max-height: 25px;
+}
+.flex-here {
+ display: flex;
+ justify-content: center;
+}
+.flex-left {
+ height: 25px;
+}
+.flex-mem {
+ display: flex;
+ justify-content: center;
+}
+.flex-mem-box {
+ background-color: #92869c;
+ border-color: black;
+ border-width: 5px;
+ border-style: solid;
+ margin: 10px;
+ padding: 10px;
+ color: black;
+}
+@media (max-width: 350px) {
+ #video {
+ width: 300;
+ height: 200;
+ }
+}
+```
diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-technical-documentation-page-project/build-a-technical-documentation-page.md b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-technical-documentation-page-project/build-a-technical-documentation-page.md
new file mode 100644
index 00000000000..5c2fd8307c6
--- /dev/null
+++ b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-technical-documentation-page-project/build-a-technical-documentation-page.md
@@ -0,0 +1,529 @@
+---
+id: 587d78b0367417b2b2512b05
+title: Construye una página de documentación técnica
+challengeType: 14
+forumTopicId: 301146
+dashedName: build-a-technical-documentation-page
+---
+
+# --description--
+
+**Objetivo:** Crea una aplicación que sea funcionalmente similar a https://technical-documentation-page.freecodecamp.rocks
+
+**Historias de Usuario:**
+
+1. Puedes ver un elemento `main` con su correspondiente `id="main-doc"`, el cual abarcará el contenido principal de la página (documentación técnica)
+1. Dentro del elemento `#main-doc`, se pueden ver varios elementos `section`, cada uno con la clase `main-section`. Debe haber un mínimo de cinco
+1. El primer elemento dentro de cada `.main-section` debería ser un elemento `header`, el cual contendrá texto que describa el tema de esa sección.
+1. Cada elemento `section` con la clase `main-section` debería tener también un `id` que corresponda al texto de cada `header` contenido dentro de él. Cualquier espacio debe ser reemplazado por guiones bajos ( Ejemplo: La sección que contiene el encabezado "JavaScript and Java" debe tener un `id="JavaScript_and_Java"`)
+1. Los elementos `.main-section` deberán tener al menos diez elementos `p` en total (no cada uno)
+1. Los elementos `.main-section` deberán tener al menos cinco elementos `code` en total (no cada uno)
+1. Los elementos `.main-section` deberán tener al menos cinco items `li` en total (no cada uno)
+1. Puedes ver un elemento `nav` con su correspondiente `id="navbar"`
+1. La barra de navegación deberá contener un elemento `header`, el cual contendrá texto que describa el tema de la documentación técnica
+1. Además, la barra de navegación deberá contener elementos de enlace (`a`) con la clase `nav-link`. Debe haber uno para cada elemento con la clase `main-section`
+1. El elemento `header` dentro de la `#navbar` debería ir antes que los elementos (`a`) de la barra de navegación
+1. Cada elemento con la clase `nav-link` debería tener texto que corresponda al texto del `header` de cada `section` (Ejemplo: Si tienes una seccion/encabezado "Hello world", tu barra de navegación debería tener un elemento que contenga el texto "Hello world")
+1. Al hacer click en un elemento de tu barra de navegación, la página debería dirigirse a la sección correspondiente del elemento `#main-doc` (Ejemplo: Si haces click en el elemento `.nav-link` que contiene el texto "Hello world", la página debería dirigirse al elemento `section` que tenga ese id y contenga el encabezado correspondiente)
+1. En dispositivos de tamaño normal (portatiles, computadoras de escritorio), el elemento con `id="navbar"` debe mostrarse en el lado izquierdo de la pantalla y siempre ser visible para el usuario
+1. Tu documentación técnica debe usar al menos una media query
+
+Completa las historias de usuario y pasa todas las pruebas a continuación para completar este proyecto. Dale tu propio estilo personal. ¡Feliz día programando!
+
+**Nota:** Asegúrate de agregar ` ` en tu HTML para enlazar tu hoja de estilos y aplicar tu CSS
+
+# --hints--
+
+Debes tener un elemento `main` con un `id` de `main-doc`.
+
+```js
+const el = document.getElementById('main-doc')
+assert(!!el)
+```
+
+Debes tener al menos cinco elementos `section` con la clase `main-section`.
+
+```js
+const els = document.querySelectorAll('#main-doc section')
+assert(els.length >= 5)
+```
+
+Todos tus elementos `.main-section` deben ser elementos `section`.
+
+```js
+const els = document.querySelectorAll('.main-section')
+els.forEach(el => {
+ if (el.tagName !== 'SECTION') assert(false)
+})
+assert(els.length > 0)
+```
+
+Debes tener al menos cinco elementos `.main-section` que sean descendientes de `#main-doc`.
+
+```js
+const els = document.querySelectorAll('#main-doc .main-section')
+assert(els.length >= 5)
+```
+
+El primer hijo de cada `.main-section` debe ser un elemento `header`.
+
+```js
+const els = document.querySelectorAll('.main-section')
+els.forEach(el => {
+ if(el.firstElementChild?.tagName !== 'HEADER') assert(false)
+})
+assert(els.length > 0)
+```
+
+Ninguno de tus elementos `header` debe estar vacío.
+
+```js
+const els = document.querySelectorAll('header')
+els.forEach(el => {
+ if (el.innerText?.length <= 0) assert(false)
+})
+assert(els.length > 0)
+```
+
+Todos tus elementos `.main-section` deben tener un `id`.
+
+```js
+const els = document.querySelectorAll('.main-section')
+els.forEach(el => {
+ if (!el.id || el.id === '') assert(false)
+})
+assert(els.length > 0)
+```
+
+Cada `.main-section` debe tener un `id` que coincida con el texto de su primer hijo, para tener espacios en el texto de su hijo reemplace los espacios por (`_`) para los id.
+
+```js
+const els = document.querySelectorAll('.main-section')
+els.forEach(el => {
+ const text = el.firstElementChild?.innerText?.replaceAll(' ', '_')
+ if (el.id?.toUpperCase() !== text?.toUpperCase()) assert(false)
+})
+assert(els.length > 0)
+```
+
+Debes tener al menos 10 elementos (en total) `p` dentro de tus elementos `.main-section`.
+
+```js
+const els = document.querySelectorAll('.main-section p')
+assert(els.length >= 10)
+```
+
+Debes tener al menos cinco elementos `code` que sean descendientes de los elementos `.main-section`.
+
+```js
+const els = document.querySelectorAll('.main-section code')
+assert(els.length >= 5)
+```
+
+Debes tener al menos cinco elementos `li` que sean descendientes de los elementos `.main-section`.
+
+```js
+const els = document.querySelectorAll('.main-section li')
+assert(els.length >= 5)
+```
+
+Debes tener un elemento `nav` con un `id` de `navbar`.
+
+```js
+const el = document.getElementById('navbar')
+assert(!!el && el.tagName === 'NAV')
+```
+
+Tu `#navbar` debe tener exactamente un elemento `header` dentro de él.
+
+```js
+const els = document.querySelectorAll('#navbar header')
+assert(els.length === 1)
+```
+
+Debes tener al menos un elemento `a` con la clase `nav-link`.
+
+```js
+const els = document.querySelectorAll('a.nav-link')
+assert(els.length >= 1)
+```
+
+Todos tus elementos `.nav-link` deben ser elementos de anclaje (`a`).
+
+```js
+const els = document.querySelectorAll('.nav-link')
+els.forEach(el => {
+ if (el.tagName !== 'A') assert(false)
+})
+assert(els.length > 0)
+```
+
+Todos tus elementos `.nav-link` deben estar en el `#navbar`.
+
+```js
+const els1 = document.querySelectorAll('.nav-link')
+const els2 = document.querySelectorAll('#navbar .nav-link')
+assert(els2.length > 0 && els1.length === els2.length)
+```
+
+Debes tener el mismo número de elementos `.nav-link` y `.main-section`.
+
+```js
+const els1 = document.querySelectorAll('.main-section')
+const els2 = document.querySelectorAll('.nav-link')
+assert(els1.length > 0 && els2.length > 0 && els1.length === els2.length)
+```
+
+El elemento `header` en el `#navbar` debe estar antes que cualquier enlace (`a`) en el `#navbar`.
+
+```js
+const navLinks = document.querySelectorAll('#navbar a.nav-link');
+const header = document.querySelector('#navbar header');
+navLinks.forEach((navLink) => {
+ if (
+ (
+ header.compareDocumentPosition(navLink) &
+ Node.DOCUMENT_POSITION_PRECEDING
+ )
+ ) assert(false)
+});
+assert(!!header)
+```
+
+Cada `.nav-link` debe tener un texto que corresponda con el texto del `header` de su `section` relacionado (por ejemplo, si tienes un section/header "Hello world", tu `#navbar` debe tener un `.nav-link` que tenga el texto "Hello world").
+
+```js
+const headerText = Array.from(document.querySelectorAll('.main-section')).map(el =>
+ el.firstElementChild?.innerText?.trim().toUpperCase()
+)
+const linkText = Array.from(document.querySelectorAll('.nav-link')).map(el =>
+ el.innerText?.trim().toUpperCase()
+)
+const remainder = headerText.filter(str => linkText.indexOf(str) === -1)
+assert(headerText.length > 0 && headerText.length > 0 && remainder.length === 0)
+```
+
+Cada `.nav-link` debe tener un atributo `href` que enlace a su correspondiente `.main-section` (por ejemplo, si haces clic en un elemento `.nav-link` que contenga el texto "Hello world", la pagina navega al elemento `section` con ese id).
+
+```js
+const hrefValues = Array.from(document.querySelectorAll('.nav-link')).map(el => el.getAttribute('href'))
+const mainSectionIDs = Array.from(document.querySelectorAll('.main-section')).map(el => el.id)
+const missingHrefValues = mainSectionIDs.filter(str => hrefValues.indexOf('#' + str) === -1)
+assert(hrefValues.length > 0 && mainSectionIDs.length > 0 && missingHrefValues.length === 0)
+```
+
+Tu `#navbar` siempre debe estar en el borde izquierdo de la ventana.
+
+```js
+const el = document.getElementById('navbar')
+const left1 = el?.offsetLeft
+const left2 = el?.offsetLeft
+assert(!!el && left1 >= -15 && left1 <= 15 && left2 >= -15 && left2 <= 15)
+```
+
+Tu proyecto de documentación técnica debe usar al menos una media query.
+
+```js
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+```
+
+```css
+
+```
+
+## --solutions--
+
+```html
+
+
+
+
+
+ Technical Documentation Page
+
+
+
+
+
+ Introduction
+
+ Definitions
+
+ Examples
+
+ Solving Equations
+
+ Solving Equations II
+
+ Solving Equations III
+
+ System of Equations
+
+ Try it Yourself!
+
+ More Information
+
+
+
+
+
+ Welcome to a basic introduction of algebra. In this tutorial, we will
+ review some of the more common algebraic concepts.
+
+
+
+
+
+ To start with, let's define some of the more common terms used in
+ algebra:
+
+
+
+ Variable: A variable is an unknown value, usually represented
+ by a letter.
+
+
+ Expression: Essentially a mathematical object. For the
+ purpose of this tutorial, an expression is one part of an equation.
+
+
+ Equation: An equation is a mathematical argument in which two
+ expressions result in the same value.
+
+
+
+
+
+
+ Sometimes it is easier to understand the definitions when you have a
+ physical example to look at. Here is an example of the above terms.
+ x + 5 = 12
+ In this above example, we have:
+
+
+ Variable: The variable in the example is "x".
+
+ Expression: There are two expressions in this example. They
+ are "x+5" and "12".
+
+
+ Equation: The entire example, "x+5=12", is an equation.
+
+
+
+
+
+
+ The primary use for algebra is to determine an unknown value, the
+ "variable", with the information provided. Continuing to use our
+ example from above, we can find the value of the variable "x".
+ x + 5 = 12
+ In an equation, both sides result in the same value. So you can
+ manipulate the two expressions however you need, as long as you
+ perform the same operation (or change) to each side. You do this
+ because the goal when solving an equation is to
+ get the variable into its own expression, or by itself on one side
+ of the = sign. For this example, we want to remove the "+5" so the "x" is
+ alone. To do this, we can subtract 5 , because subtraction is
+ the opposite operation to addition. But remember, we have to perform
+ the same operation to both sides of the equation. Now our equation
+ looks like this.
+ x + 5 - 5 = 12 - 5
+ The equation looks like a mess right now, because we haven't completed
+ the operations. We can simplify this equation to make it easier
+ to read by performing the operations "5-5" and "12-5". The result
+ is:
+ x = 7
+ We now have our solution to this equation!
+
+
+
+
+
+ Let us look at a slightly more challenging equation.
+ 3x + 4 = 13
+ Again we can start with subtraction. In this case, we want to subtract
+ 4 from each side of the equation. We will also go ahead and simplify
+ with each step. So now we have:
+ 3x = 9
+ "3x" translates to "3*x", where the "*" symbol indicates
+ multiplication. We use the "*" to avoid confusion, as the "x" is now a
+ variable instead of a multiplication symbol. The opposite operation
+ for multiplication is division, so we need to
+ divide each expression by 3 .
+ x = 3
+ And now we have our solution!
+
+
+
+
+
+ Now we are getting in to more complex operations. Here is another
+ equation for us to look at:
+ x^2 - 8 = 8
+ Our very first step will be to add 8 to each side. This is
+ different from our previous examples, where we had to subtract. But
+ remember, our goal is to get the variable alone by performing opposite
+ operations.
+ x^2 = 16
+ But what does the "^2" mean? The "^" symbol is used to denote
+ exponents in situations where superscript is not available. When
+ superscript is available, you would see it as x2 .
+ For the sake of this project, however, we will use the "^" symbol.
+ An exponent tells you how many times the base (in our case, "x") is
+ multiplied by itself. So, "x^2" would be the same as "x*x". Now the
+ opposite function of multiplication is division, but we would have to
+ divide both sides by "x" . We do not want to do this, as that
+ would put an "x" on the other side of the equation. So instead, we
+ need to use the root operation! For an exponent of "2", we call this
+ the "square root" and denote it with "√". Our equation is now:
+
+ x = √9
+ Performing a root operation by hand can be a tedious process, so we
+ recommend using a calculator when necessary. However, we are lucky in
+ that "9" is a
+ perfect square , so we do not need to calculate anything. Instead, we find our
+ answer to be:
+ x = 3
+
+
+
+
+
+ As you explore your algebra studies further, you may start to run
+ across equations with more than one variable. The first such equations
+ will likely look like:
+ y = 3x
+ An equation like this does not have one single solution .
+ Rather, there are a series of values for which the equation is true.
+ For example, if "x=3" and "y=9", the equation is true. These equations
+ are usually used to plot a graph.
+ Getting more complicated, though, you may be given a pair of
+ equations. This is called a "system of equations", and CAN be solved.
+ Let's look at how we do this! Consider the following system of
+ equations:
+ y = 3x | y - 6 = x
+ A system of equations IS solvable, but it is a multi-step process. To
+ get started, we need to chose a variable we are solving for. Let's
+ solve for "x" first. From the second equation, we know that "x" equals
+ "y - 6", but we cannot simplify that further because we do not have a
+ value for "y". Except, thanks to the system of equations, we DO have a
+ value for "y". We know that "y" equals "3x". So, looking at our second
+ equation, we can replace "y" with "3x" because they have the same
+ value. We then get:
+ 3x - 6 = x
+ Now we can solve for "x"! We start by adding 6 to each side.
+ 3x = x + 6
+ We still need to get "x" by itself, so we subtract "x" from both sides
+ and get:
+ 2x = 6
+ If this confuses you, remember that "3x" is the same as "x+x+x".
+ Subtract an "x" from that and you get "x+x", or "2x". Now we divide
+ both sides by 2 and have our value for x!
+ x = 3
+ However, our work is not done yet. We still need to find the value for
+ "y". Let's go back to our first equation:
+ y = 3x
+ We have a value for "x" now, so let's see what happens if we put that
+ value in.
+ y = 3*3
+ We perform the multiplication and discover that "y=9"! Our solution to
+ this system of equations then is:
+ x = 3 and y = 9
+
+
+
+
+ Coming Soon!
+ Keep an eye out for new additions!
+
+
+
+ Check out the following links for more information!
+
+
+
+
+
+
+```
+
+```css
+* {
+ background-color: #3a3240;
+}
+a {
+ color: #92869c;
+}
+a:hover {
+ background-color: #92869c;
+ color: #3a3240;
+}
+#navbar {
+ border-style: solid;
+ border-width: 5px;
+ border-color: #92869c;
+ height: 100%;
+ top: -5px;
+ left: -5px;
+ padding: 5px;
+ text-align: center;
+ color: #92869c
+}
+@media (min-width: 480px) {
+ #navbar {
+ position: fixed;
+ }
+}
+main {
+ margin-left: 220px;
+ color: #92869c
+}
+header {
+ font-size: 20pt;
+}
+code {
+ background-color: #92869c;
+ border-style: dashed;
+ border-width: 2px;
+ border-color: #92869c;
+ padding: 5px;
+ color: black;
+}
+footer {
+ text-align: center;
+}
+```
diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md
index ce0a9f2a5ae..0941dfc4276 100644
--- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md
+++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md
@@ -38,7 +38,7 @@ assert($('p')[0].previousElementSibling.tagName === 'H1');
Tu elemento `p` debe tener el texto `Est. 2020`.
```js
-assert(code.match(/Est. 2020<\/p>/i));
+assert(document.querySelector("p").innerText === "Est. 2020");
```
# --seed--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md
index 2048c5f5cc0..516f72cf3f1 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md
@@ -38,7 +38,7 @@ assert($('p')[0].previousElementSibling.tagName === 'H1');
L'elemento `p` dovrebbe avere il testo `Est. 2020`.
```js
-assert(code.match(/
Est. 2020<\/p>/i));
+assert(document.querySelector("p").innerText === "Est. 2020");
```
# --seed--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477aefa51bfc29327200b.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477aefa51bfc29327200b.md
index 69952cae34b..0a229ee6943 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477aefa51bfc29327200b.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477aefa51bfc29327200b.md
@@ -31,12 +31,10 @@ Il selettore dovrebbe assegnare alla proprietà `text-align` il valore `center`.
}
```
-Dovresti avere un solo selettore.
+Il codice non dovrebbe contenere i tag `