diff --git a/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md b/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
index 380206d43ae..32a6e97073c 100644
--- a/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
+++ b/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
@@ -206,10 +206,41 @@ assert(!!el && el.name === 'email')
你的 `#nav-bar` 元素應該始終位於視口的頂部
```js
-const el = document.getElementById('nav-bar')
-const top1 = el?.offsetTop
-const top2 = el?.offsetTop
-assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
+(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);
+})();
```
你的產品登陸頁面至少要有一個媒體查詢
diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
index f303012dad8..47694d5f86a 100644
--- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
+++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
@@ -29,21 +29,7 @@ const ourMusic = [
];
```
-這是一個包含一個對象的數組。 該對象有關於專輯的各種元數據(metadata)。 它也有一個嵌套的 `formats` 數組。 可以將專輯添加到頂級數組來增加更多的專輯記錄。 對象將數據以一種鍵 - 值對的形式保存。 在上面的示例中,`"artist": "Daft Punk"` 有一個鍵爲 `artist` 值爲 `Daft Punk` 的屬性。 [JavaScript Object Notation](http://www.json.org/) 簡稱 `JSON` 是可以用於存儲數據的數據交換格式。
-
-```json
-{
- "artist": "Daft Punk",
- "title": "Homework",
- "release_year": 1997,
- "formats": [
- "CD",
- "Cassette",
- "LP"
- ],
- "gold": true
-}
-```
+這是一個包含一個對象的數組。 該對象有關於專輯的各種元數據(metadata)。 它也有一個嵌套的 `formats` 數組。 可以將專輯添加到頂級數組來增加更多的專輯記錄。 對象將數據以一種鍵 - 值對的形式保存。 在上面的示例中,`"artist": "Daft Punk"` 有一個鍵爲 `artist` 值爲 `Daft Punk` 的屬性。
**提示:**數組中有多個 JSON 對象的時候,對象與對象之間要用逗號隔開。
diff --git a/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md b/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
index 39f9eb0d629..26afb73f1d6 100644
--- a/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
+++ b/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
@@ -206,10 +206,41 @@ assert(!!el && el.name === 'email')
你的 `#nav-bar` 元素应该始终位于视口的顶部
```js
-const el = document.getElementById('nav-bar')
-const top1 = el?.offsetTop
-const top2 = el?.offsetTop
-assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
+(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);
+})();
```
你的产品登陆页面至少要有一个媒体查询
diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
index d2145515b93..c2d9a2ffcad 100644
--- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
+++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
@@ -29,21 +29,7 @@ const ourMusic = [
];
```
-这是一个包含一个对象的数组。 该对象有关于专辑的各种元数据(metadata)。 它也有一个嵌套的 `formats` 数组。 可以将专辑添加到顶级数组来增加更多的专辑记录。 对象将数据以一种键 - 值对的形式保存。 在上面的示例中,`"artist": "Daft Punk"` 有一个键为 `artist` 值为 `Daft Punk` 的属性。 [JavaScript Object Notation](http://www.json.org/) 简称 `JSON` 是可以用于存储数据的数据交换格式。
-
-```json
-{
- "artist": "Daft Punk",
- "title": "Homework",
- "release_year": 1997,
- "formats": [
- "CD",
- "Cassette",
- "LP"
- ],
- "gold": true
-}
-```
+这是一个包含一个对象的数组。 该对象有关于专辑的各种元数据(metadata)。 它也有一个嵌套的 `formats` 数组。 可以将专辑添加到顶级数组来增加更多的专辑记录。 对象将数据以一种键 - 值对的形式保存。 在上面的示例中,`"artist": "Daft Punk"` 有一个键为 `artist` 值为 `Daft Punk` 的属性。
**提示:**数组中有多个 JSON 对象的时候,对象与对象之间要用逗号隔开。
diff --git a/curriculum/challenges/espanol/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md b/curriculum/challenges/espanol/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
index 98ac4a16a04..3c5ed143f59 100644
--- a/curriculum/challenges/espanol/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
+++ b/curriculum/challenges/espanol/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
@@ -206,10 +206,41 @@ assert(!!el && el.name === 'email')
Tú `#nav-bar` siempre debe estar en la parte superior del viewport
```js
-const el = document.getElementById('nav-bar')
-const top1 = el?.offsetTop
-const top2 = el?.offsetTop
-assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
+(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 inicio de producto debe tener al menos una consulta de medios
diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
index 5404cd0fd0a..c391715d2da 100644
--- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
+++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
@@ -29,21 +29,7 @@ const ourMusic = [
];
```
-Esto es una arreglo que contiene un objeto en su interior. El objeto tiene varias piezas de metadatos sobre un álbum. También tiene un arreglo anidado de `formats`. Si desea añadir más registros de álbumes, puede hacerlo añadiendo registros a la parte superior del arreglo. Los objetos almacenan datos en una propiedad, con formato clave-valor. En el ejemplo anterior, `"artist": "Daft Punk"` es una propiedad que tiene como clave `artist` y su valor es `Daft Punk`. [JavaScript Object Notation](http://www.json.org/) o `JSON` es un formato de intercambio de datos relacionado utilizado para almacenar información.
-
-```json
-{
- "artist": "Daft Punk",
- "title": "Homework",
- "release_year": 1997,
- "formats": [
- "CD",
- "Cassette",
- "LP"
- ],
- "gold": true
-}
-```
+Esto es una arreglo que contiene un objeto en su interior. El objeto tiene varias piezas de metadatos sobre un álbum. También tiene un arreglo anidado de `formats`. Si desea añadir más registros de álbumes, puede hacerlo añadiendo registros a la parte superior del arreglo. Los objetos almacenan datos en una propiedad, con formato clave-valor. En el ejemplo anterior, `"artist": "Daft Punk"` es una propiedad que tiene como clave `artist` y su valor es `Daft Punk`.
**Nota:** Deberás colocar una coma después de cada objeto en el arreglo, a menos que sea el último objeto.
diff --git a/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md b/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
index 1399fa32b76..d5023c785a6 100644
--- a/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
+++ b/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
@@ -206,10 +206,41 @@ assert(!!el && el.name === 'email')
L'elemento `#nav-bar` dovrebbe sempre essere in cima al viewport
```js
-const el = document.getElementById('nav-bar')
-const top1 = el?.offsetTop
-const top2 = el?.offsetTop
-assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
+(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);
+})();
```
La pagina dovrebbe avere almeno un media query
diff --git a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
index ee2a3f97b13..7c9f7352f09 100644
--- a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
+++ b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
@@ -29,21 +29,7 @@ const ourMusic = [
];
```
-Questo è un array che contiene un oggetto al suo interno. L'oggetto ha vari pezzi di metadati riguardanti un album. Ha anche un array annidato `formats`. Se volessi aggiungere più record di tipo album, potresti farlo aggiungendo dei record all'array di livello superiore. Gli oggetti contengono i dati nelle proprietà, che hanno un formato chiave-valore (key-value). Nell'esempio sopra, `"artist": "Daft Punk"` è una proprietà che ha una chiave `artist` e un valore `Daft Punk`. [JavaScript Object Notation](http://www.json.org/) o `JSON` è un formato di scambio di dati, utilizzato per memorizzare dati.
-
-```json
-{
- "artist": "Daft Punk",
- "title": "Homework",
- "release_year": 1997,
- "formats": [
- "CD",
- "Cassette",
- "LP"
- ],
- "gold": true
-}
-```
+Questo è un array che contiene un oggetto al suo interno. L'oggetto ha vari pezzi di metadati riguardanti un album. Ha anche un array annidato `formats`. Se volessi aggiungere più record di tipo album, potresti farlo aggiungendo dei record all'array di livello superiore. Gli oggetti contengono i dati nelle proprietà, che hanno un formato chiave-valore (key-value). Nell'esempio sopra, `"artist": "Daft Punk"` è una proprietà che ha una chiave `artist` e un valore `Daft Punk`.
**Nota:** Dovrai inserire una virgola dopo ogni oggetto nell'array, a meno che non sia l'ultimo.
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8bfe0f30a1a3c340356b.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8bfe0f30a1a3c340356b.md
index 6dabe285bcb..26c92fa59d6 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8bfe0f30a1a3c340356b.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8bfe0f30a1a3c340356b.md
@@ -7,55 +7,55 @@ dashedName: step-62
# --description--
-Crea un altro elemento `p`, dagli il testo `Calcium 260mg 20%`. Allinea `20%` a destra. Sotto di quello, crea un elemento `p` con il testo `Iron 8mg 45%`, allineando il `45%` a destra.
+Crea un altro elemento `p` e dagli il testo `Calcium 260mg 20%`. Allinea il `20%` a destra. Al di sotto, crea un elemento `p` con il testo `Iron 8mg 45%`, allineando il `45%` a destra.
# --hints--
-Dovresti creare due nuovi elementi `p` alla fine del tuo elemento `.daily-value.sm-text`.
+Dovresti creare due nuovi elementi `p` alla fine dell'elemento `.daily-value.sm-text`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.localName === 'p');
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.previousElementSibling?.localName === 'p');
```
-Il tuo primo nuovo elemento `p` dovrebbe avere il testo `Calcium 260mg 20%`.
+Il primo nuovo elemento `p` dovrebbe avere il testo `Calcium 260mg 20%`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.previousElementSibling?.innerText?.match(/Calcium 260mg[\s|\n]+20%/));
```
-Il tuo primo nuovo elemento `p` dovrebbe avere un elemento `span`.
+Il primo nuovo elemento `p` dovrebbe avere un elemento `span`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.previousElementSibling?.firstElementChild?.localName === 'span');
```
-Il tuo primo elemento `span` dovrebbe avere l'attributo `class` impostato a `right`. Ricorda, non renderlo in grassetto.
+Il primo elemento `span` dovrebbe avere l'attributo `class` con il valore `right`. Ricorda, non metterlo in grassetto.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.previousElementSibling?.firstElementChild?.classList?.contains('right'));
assert(!document.querySelector('.daily-value.sm-text')?.lastElementChild?.previousElementSibling?.firstElementChild?.classList?.contains('bold'));
```
-Il tuo primo elemento `span` dovrebbe avvolgere il testo `20%`.
+Il primo elemento `span` dovrebbe racchiudere il testo `20%`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.previousElementSibling?.firstElementChild?.innerText === '20%');
```
-Il tuo secondo nuovo elemento `p` dovrebbe avere il testo `Iron 8mg 45%`.
+Il secondo nuovo elemento `p` dovrebbe avere il testo `Iron 8mg 45%`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.innerText?.match(/Iron 8mg[\s|\n]+45%/));
```
-Il tuo secondo nuovo elemento `p` dovrebbe avere un elemento `span`.
+Il secondo nuovo elemento `p` dovrebbe avere un elemento `span`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.firstElementChild?.localName === 'span');
```
-Il tuo secondo elemento di `span` dovrebbe avere l'attributo `class` impostato a `right`. Ricorda, non renderlo in grassetto.
+Il secondo elemento `span` dovrebbe avere l'attributo `class` con il valore `right`. Ricorda, non metterlo in grassetto.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.firstElementChild?.classList?.contains('right'));
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8f1223601fa546e93f31.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8f1223601fa546e93f31.md
index 7f81afef36c..3d13aea822f 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8f1223601fa546e93f31.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8f1223601fa546e93f31.md
@@ -7,35 +7,35 @@ dashedName: step-63
# --description--
-Crea l'elemento finale `p` per la tua sezione `.daily-value`. Dagli il testo `Potassium 235mg 6%`. Allinea il testo `6%` a destra e rimuovi il bordo inferiore dell'elemento `p`.
+Crea l'elemento finale `p` per la sezione `.daily-value`. Dagli il testo `Potassium 235mg 6%`. Allinea il testo `6%` a destra e rimuovi il bordo inferiore dell'elemento `p`.
# --hints--
-Dovresti creare un nuovo elemento `p` alla fine del tuo elemento `.daily-value.sm-text`.
+Dovresti creare un nuovo elemento `p` alla fine dell'elemento `.daily-value.sm-text`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.localName === 'p');
```
-Il tuo nuovo elemento `p` dovrebbe avere l'attributo `class` impostato a `no-divider`.
+Il nuovo elemento `p` dovrebbe avere l'attributo `class` con il valore `no-divider`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.classList?.contains('no-divider'));
```
-Il tuo nuovo elemento `p` dovrebbe avere il testo `Potassium 235mg 6%`.
+Il nuovo elemento `p` dovrebbe avere il testo `Potassium 235mg 6%`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.innerText?.match(/Potassium 235mg[\s|\n]+6%/));
```
-Il tuo nuovo elemento `p` dovrebbe avere un elemento `span`.
+Il nuovo elemento `p` dovrebbe avere un elemento `span`.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.querySelectorAll('span')?.length === 1);
```
-Il tuo elemento `span` dovrebbe avere l'attributo `class` impostato a `right`. Ricorda che non dovresti farlo in grassetto.
+L'elemento `span` dovrebbe avere l'attributo `class` con il valore `right`. Ricorda di non metterlo in grassetto.
```js
assert(document.querySelector('.daily-value.sm-text')?.lastElementChild?.querySelector('span')?.classList?.contains('right'));
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f905fbd1017a65ca224eb.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f905fbd1017a65ca224eb.md
index 6e01b50f23a..a76b6c7959e 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f905fbd1017a65ca224eb.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f905fbd1017a65ca224eb.md
@@ -7,7 +7,7 @@ dashedName: step-64
# --description--
-Aggiungi un divisore medio dopo il tuo elemento `.daily-value`. Sotto quel nuovo divisore, crea un elemento `p` con l'attributo `class` impostato a `note`.
+Aggiungi un divider medio dopo l'elemento `.daily-value`. Sotto il nuovo divider, crea un elemento `p` con l'attributo `class` impostato su `note`.
Dai all'elemento `p` il seguente testo:
@@ -17,32 +17,32 @@ Dai all'elemento `p` il seguente testo:
# --hints--
-Dovresti creare un nuovo `div` dopo il tuo elemento `.daily-value`.
+Dovresti creare un nuovo `div` dopo l'elemento `.daily-value`.
```js
assert(document.querySelector('.daily-value').nextElementSibling?.localName === 'div');
```
-Il tuo nuovo `div` dovrebbe avere l'attributo `class` impostato su `divider md`.
+Il nuovo `div` dovrebbe avere l'attributo `class` con il valore `divider md`.
```js
assert(document.querySelector('.daily-value')?.nextElementSibling?.classList?.contains('divider'));
assert(document.querySelector('.daily-value')?.nextElementSibling?.classList?.contains('md'));
```
-Dovresti creare un elemento `p` dopo il tuo nuovo elemento `div`.
+Dovresti creare un elemento `p` dopo il nuovo elemento `div`.
```js
assert(document.querySelector('.label')?.lastElementChild?.localName === 'p');
```
-Il tuo nuovo elemento `p` dovrebbe avere la `class` impostata a `note`.
+Il nuovo elemento `p` dovrebbe avere l'attributo `class` con il valore `note`.
```js
assert(document.querySelector('.label')?.lastElementChild?.classList?.contains('note'));
```
-Il tuo nuovo elemento `p` dovrebbe avere il testo fornito.
+Il nuovo elemento `p` dovrebbe avere il testo fornito.
```js
assert.equal(document.querySelector('.label')?.lastElementChild?.innerText, '* The % Daily Value (DV) tells you how much a nutrient in a serving of food contributes to a daily diet. 2,000 calories a day is used for general nutrition advice.');
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f94786869e1a7fec54375.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f94786869e1a7fec54375.md
index d88fc72112e..1a7568cb176 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f94786869e1a7fec54375.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f94786869e1a7fec54375.md
@@ -17,13 +17,13 @@ Dovresti avere un nuovo selettore `.note`.
assert(new __helpers.CSSHelp(document).getStyle('.note'));
```
-Il selettore `.note` dovrebbe avere una proprietà `font-size` impostata a `0.6rem`.
+Il selettore `.note` dovrebbe avere una proprietà `font-size` con il valore `0.6rem`.
```js
assert(new __helpers.CSSHelp(document).getStyle('.note')?.fontSize === '0.6rem');
```
-Il selettore `.note` dovrebbe avere una proprietà `margin` impostata a `5px 0`.
+Il selettore `.note` dovrebbe avere una proprietà `margin` con il valore `5px 0`.
```js
assert(new __helpers.CSSHelp(document).getStyle('.note')?.margin === '5px 0px');
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f951dff9317a900ef683f.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f951dff9317a900ef683f.md
index 47d490e5db9..9019d74eac4 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f951dff9317a900ef683f.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f951dff9317a900ef683f.md
@@ -7,13 +7,13 @@ dashedName: step-66
# --description--
-Dai al selettore `.note` un padding a sinistra e a destra di `8px`, rimuovendo il padding in alto e in basso. Dovresti anche impostare la proprietà `text-indent` a `-8px`.
+Dai al selettore `.note` un padding di sinistra e di destra di `8px`, rimuovendo il padding in alto e in basso. Dovresti anche impostare la proprietà `text-indent` a `-8px`.
Con queste ultime modifiche, la tua etichetta nutrizionale è completa!
# --hints--
-Il selettore `.note` dovrebbe avere una proprietà `padding` impostata a `0 8px`.
+Il selettore `.note` dovrebbe avere una proprietà `padding` con il valore `0 8px`.
```js
assert.equal(new __helpers.CSSHelp(document).getStyle('.note')?.paddingTop, '0px');
@@ -22,7 +22,7 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.note')?.paddingLeft, '8p
assert.equal(new __helpers.CSSHelp(document).getStyle('.note')?.paddingRight, '8px');
```
-Il tuo selettore `.note` dovrebbe avere una proprietà `text-indent` impostata a `-8px`.
+Il selettore `.note` dovrebbe avere una proprietà `text-indent` con il valore `-8px`.
```js
assert(new __helpers.CSSHelp(document).getStyle('.note')?.textIndent === '-8px');
diff --git a/curriculum/challenges/japanese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md b/curriculum/challenges/japanese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
index 5a39c77c551..ecc15b51e90 100644
--- a/curriculum/challenges/japanese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
+++ b/curriculum/challenges/japanese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
@@ -206,10 +206,41 @@ assert(!!el && el.name === 'email')
`#nav-bar` は常にビューポートの上部にある必要があります
```js
-const el = document.getElementById('nav-bar')
-const top1 = el?.offsetTop
-const top2 = el?.offsetTop
-assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
+(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);
+})();
```
プロダクトランディングページに、少なくとも 1 つのメディアクエリが使われている必要があります
diff --git a/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md b/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
index 7f11baa104a..e3f8f3502b3 100644
--- a/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
+++ b/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
@@ -29,21 +29,7 @@ const ourMusic = [
];
```
-これは内部にオブジェクトを 1 つ含む配列です。 このオブジェクトには、アルバムに関するさまざまなメタデータがあります。 また、ネストされた `formats` という配列もあります。 アルバムレコードを追加したい場合は、最上位の配列にレコードを追加することで実現できます。 オブジェクトではデータがプロパティに保持されます。プロパティはキーと値の組み合わせの形式を持ちます。 上記の例では、`"artist": "Daft Punk"` はプロパティで、`artist` というキーと `Daft Punk` という値を持っています。 データの格納に使用される関連のデータ交換形式として、[JavaScript Object Notation](http://www.json.org/) (`JSON`) という形式があります。
-
-```json
-{
- "artist": "Daft Punk",
- "title": "Homework",
- "release_year": 1997,
- "formats": [
- "CD",
- "Cassette",
- "LP"
- ],
- "gold": true
-}
-```
+これは内部にオブジェクトを 1 つ含む配列です。 このオブジェクトには、アルバムに関するさまざまなメタデータがあります。 また、ネストされた `formats` という配列もあります。 アルバムレコードを追加したい場合は、最上位の配列にレコードを追加することで実現できます。 オブジェクトではデータがプロパティに保持されます。プロパティはキーと値の組み合わせの形式を持ちます。 上記の例では、`"artist": "Daft Punk"` はプロパティで、`artist` というキーと `Daft Punk` という値を持っています。
**注:** 配列内では、最後のオブジェクトを除くすべてのオブジェクトの後にコンマを置く必要があります。
diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md b/curriculum/challenges/japanese/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md
index f6d624e3443..5c38e14dbdc 100644
--- a/curriculum/challenges/japanese/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md
+++ b/curriculum/challenges/japanese/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md
@@ -206,10 +206,41 @@ assert(!!el && el.name === 'email')
`#nav-bar` は常にビューポートの上部にある必要があります。
```js
-const el = document.getElementById('nav-bar')
-const top1 = el?.offsetTop
-const top2 = el?.offsetTop
-assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
+(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);
+})();
```
プロダクトランディングページには、少なくとも 1 つのメディアクエリが使われている必要があります。
diff --git a/curriculum/challenges/portuguese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md b/curriculum/challenges/portuguese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
index c2de62a9188..ed0a07a376a 100644
--- a/curriculum/challenges/portuguese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
+++ b/curriculum/challenges/portuguese/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md
@@ -206,10 +206,41 @@ assert(!!el && el.name === 'email')
O elemento `#nav-bar` deve estar sempre na parte superior da viewport
```js
-const el = document.getElementById('nav-bar')
-const top1 = el?.offsetTop
-const top2 = el?.offsetTop
-assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
+(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);
+})();
```
A página inicial deve ter pelo menos uma media query
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md
index 82017bedc72..908f3a99065 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md
@@ -9,7 +9,7 @@ dashedName: constructing-strings-with-variables
# --description--
-Às vezes, você precisará criar uma string, no estilo [Mad Libs](https://en.wikipedia.org/wiki/Mad_Libs). Usando o operador de concatenação (`+`), você pode inserir uma ou mais variáveis em uma string que você está criando.
+Às vezes, você precisará criar uma string. Usando o operador de concatenação (`+`), você pode inserir uma ou mais variáveis em uma string que você está criando.
Exemplo:
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md
index 44e512b9c83..2d5acc09c49 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md
@@ -9,7 +9,7 @@ dashedName: counting-cards
# --description--
-No jogo de casino Blackjack, um jogador pode ganhar vantagem sobre a casa, mantendo o número relativo de cartas altas e baixas restantes no baralho. Isso se chama [contagem de cartas](https://en.wikipedia.org/wiki/Card_counting).
+No jogo de casino Blackjack, um jogador pode determinar se tem uma vantagem sobre a próxima mão da casa, mantendo o número relativo de cartas altas e baixas restantes no baralho. Isso se chama "contar as cartas".
Ter cartas mais altas restantes no baralho favorece o jogador. A cada carta é atribuído um valor de acordo com a tabela abaixo. Quando o contador for positivo, o jogador deve apostar alto. Quando a contagem for zero ou negativa, o jogador deverá apostar baixo.
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md
index 2690820cb7a..56c016486ee 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md
@@ -11,7 +11,7 @@ dashedName: create-decimal-numbers-with-javascript
Nós também podemos armazenar números decimais em variáveis. Números decimais são às vezes referidos como números de ponto flutuante ou floats.
-**Observação:** nem todos os números reais podem ser representados com precisão no ponto flutuante. Isso pode levar a erros de arredondamento. [Detalhes aqui](https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems).
+**Observação:** os computadores representam números com precisão finita. É por isso que as operações com pontos flutuantes não podem representar precisamente as verdadeiras operações aritméticas, o que leva a muitas situações surpreendentes. Se você estiver enfrentando um desses problemas, abra um tópico no [fórum do freeCodeCamp](https://forum.freecodecamp.org/).
# --instructions--
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md
index bc401dc1d74..247e5b82f55 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md
@@ -9,7 +9,7 @@ dashedName: golf-code
# --description--
-No jogo de [golfe](https://en.wikipedia.org/wiki/Golf), cada buraco tem um `par`, significando o número médio de `strokes` que se espera que golfista faça a fim de derrubar a bola no buraco para completar a jogada. Dependendo da distância acima ou abaixo de `par` que seu número de `strokes` estiver, há diferentes apelidos.
+No jogo de golfe, cada buraco tem um `par`, significando o número médio de `strokes` que se espera que golfista faça a fim de derrubar a bola no buraco para completar a jogada. Dependendo da distância acima ou abaixo de `par` que seu número de `strokes` estiver, há diferentes apelidos.
Sua função receberá os argumentos `par` e `strokes`. Retorne a string correta de acordo com esta tabela que lista os strokes em ordem de prioridade; superior (mais alta) para o final (mais baixo):
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
index 3c7f958fc44..7712ea77333 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
@@ -29,21 +29,7 @@ const ourMusic = [
];
```
-Este é um array que contém um objeto dentro dele. O objeto possui vários pedaços de metadados sobre um álbum. Também possui um array aninhado `formats`. Se você quiser adicionar mais álbuns, você pode fazer isso adicionando os discos ao array de alto nível. Objetos armazenam dados em uma propriedade, a qual possui um formato de chave-valor. No exemplo acima, `"artist": "Daft Punk"` é uma propriedade que tem uma chave `artist` e um valor de `Daft Punk`. [JavaScript Object Notation](http://www.json.org/) ou `JSON` é um formato de intercâmbio de dados relacionados usado para armazenar dados.
-
-```json
-{
- "artist": "Daft Punk",
- "title": "Homework",
- "release_year": 1997,
- "formats": [
- "CD",
- "Cassette",
- "LP"
- ],
- "gold": true
-}
-```
+Este é um array que contém um objeto dentro dele. O objeto possui vários pedaços de metadados sobre um álbum. Também possui um array aninhado `formats`. Se você quiser adicionar mais álbuns, você pode fazer isso adicionando os discos ao array de alto nível. Objetos armazenam dados em uma propriedade, a qual possui um formato de chave-valor. No exemplo acima, `"artist": "Daft Punk"` é uma propriedade que tem uma chave `artist` e um valor de `Daft Punk`.
**Observação:** você precisará colocar uma vírgula após cada objeto no array, a não ser que ele seja o último objeto no array.
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md
index 4b28d911f64..f8e433c665a 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md
@@ -9,7 +9,7 @@ dashedName: word-blanks
# --description--
-Vamos agora usar nosso conhecimento de strings para criar um "[Mad Libs](https://en.wikipedia.org/wiki/Mad_Libs)" estilo de jogo de palavras que chamamos de "Palavras em Branco". Você criará uma frase no estilo "Preencha os espaços em branco" (opcional: de modo engraçado).
+Vamos agora usar nosso conhecimento de strings para criar um "Mad Libs" estilo de jogo de palavras que chamamos de "Preencher espaços em branco". Você criará uma frase no estilo "Preencha os espaços em branco" (opcional: de modo engraçado).
Em um jogo de "Mad Libs", você recebe frases com algumas palavras faltando, como substantivos, verbos, adjetivos e advérbios. Você então preencherá os pedaços faltantes com palavras de sua escolha de modo que a frase completa faça sentido.
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md
index 64f8fea21ae..4fce9b028c3 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md
@@ -8,11 +8,9 @@ dashedName: dna-pairing
# --description--
-A faixa de DNA está faltando o elemento de pareamento. Pegue cada caractere, pegue seu par e retorne os resultados como um array de duas dimensões.
+Os pares de fileiras de ADN são constituídos por pares de bases de proteínas. Os pares de bases são representados pelos caracteres AT and CG, que formam os blocos de construção da dupla hélice do ADN.
-[Pares de base](http://en.wikipedia.org/wiki/Base_pair) são pares de AT e CG. Associe o elemento faltando para o caractere fornecido.
-
-Retorne o caractere fornecido como o primeiro elemento em cada array.
+A fileira do ADN está sem o elemento de que faz par com ele. Escreva uma função que corresponda aos pares de base que faltam para a fileira de ADN fornecida. Para cada caractere na string fornecida, encontre o caractere de par de bases. Retorne os resultados em um array bidimensional.
Por exemplo, para a entrada `GCG`, retorne `[["G", "C"], ["C","G"], ["G", "C"]]`
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md
index a5795068b34..8cb7bbeceea 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md
@@ -10,9 +10,9 @@ dashedName: caesars-cipher
Uma das cifras mais simples e mais conhecidas é a cifra de César, também conhecida como uma cifra de mudança. Em uma cifra de transferência, os significados das letras são deslocados de acordo com a quantidade definida.
-Um uso moderno comum é a cifra [ROT13](https://en.wikipedia.org/wiki/ROT13), onde os valores das letras são deslocados em 13 lugares. Da seguinte forma: `A ↔ N`, `B ↔ O` e assim por diante.
+Um uso moderno comum é a cifra [ROT13](https://www.freecodecamp.org/news/how-to-code-the-caesar-cipher-an-introduction-to-basic-encryption-3bf77b4e19f7/), onde os valores das letras são deslocados em 13 lugares. Da seguinte forma: `A ↔ N`, `B ↔ O` e assim por diante.
-Escreva uma função que recebe uma string codificada de [ROT13](https://en.wikipedia.org/wiki/ROT13) como entrada e retorna uma string decodificada.
+Escreva uma função que recebe uma string codificada de [ROT13](https://www.freecodecamp.org/news/how-to-code-the-caesar-cipher-an-introduction-to-basic-encryption-3bf77b4e19f7/) como entrada e retorna uma string decodificada.
Todas as letras serão maiúsculas. Não transforme nenhum caractere não-alfabético (ou seja, espaços, pontuação), mas passe por eles.
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md
index ff0d3b6bacf..42926e25491 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md
@@ -10,7 +10,23 @@ dashedName: roman-numeral-converter
Converta o número dado em um número romano.
-Todas as respostas de [números romanos](http://www.mathsisfun.com/roman-numerals.html) devem ser fornecidas em maiúsculas.
+| Números romanos | Números arábicos |
+| --------------- | ---------------- |
+| M | 1000 |
+| CM | 900 |
+| D | 500 |
+| CD | 400 |
+| C | 100 |
+| XC | 90 |
+| L | 50 |
+| XL | 40 |
+| X | 10 |
+| IX | 0 |
+| V | 5 |
+| IV | 4 |
+| I | 1 |
+
+Todos os números romanos devem ser em maiúsculas.
# --hints--
diff --git a/curriculum/challenges/portuguese/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md b/curriculum/challenges/portuguese/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
index b376f7b85c8..381b87506c0 100644
--- a/curriculum/challenges/portuguese/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
+++ b/curriculum/challenges/portuguese/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
@@ -10,7 +10,9 @@ dashedName: implementation-of-social-authentication-ii
A última parte da configuração da autenticação no GitHub é criar a própria estratégia. Para isso, você precisará adicionar a dependência do `passport-github@~1.1.0` ao projeto e solicitá-la no `auth.js` como `GithubStrategy` assim: `const GitHubStrategy = require('passport-github').Strategy;`. Não se esqueça de solicitar e configurar o `dotenv` para usar as variáveis de ambiente.
-Para configurar a estratégia do GitHub, você precisa dizer ao Passport para usar uma `GitHubStrategy` instanciada, que aceite 2 argumentos: um objeto (contendo `clientID`, `clientSecret` e `callbackURL`) e uma função a ser chamada quando um usuário é autenticado com sucesso, que determinará se o usuário é novo e quais campos salvar inicialmente no objeto do banco de dados do usuário. Isto é comum em muitas estratégias, mas algumas podem exigir mais informações, conforme descrito no README do GitHub da estratégia específica. Por exemplo, O Google também requer um *scope*, o qual determina que tipo de informação a solicitação está pedindo que seja devolvida e pede ao usuário que aprove esse acesso. A estratégia atual que estamos implementando tem seu uso delineado [aqui](https://github.com/jaredhanson/passport-github/), mas nós a examinaremos bem aqui, no freeCodeCamp!
+Para configurar a estratégia do GitHub, você precisa dizer ao Passport para usar uma `GitHubStrategy` instanciada, que aceite 2 argumentos: um objeto (contendo `clientID`, `clientSecret` e `callbackURL`) e uma função a ser chamada quando um usuário é autenticado com sucesso, que determinará se o usuário é novo e quais campos salvar inicialmente no objeto do banco de dados do usuário. Isto é comum em muitas estratégias, mas algumas podem exigir mais informações, conforme descrito no README do GitHub da estratégia específica. Por exemplo, O Google também requer um *scope*, o qual determina que tipo de informação a solicitação está pedindo que seja devolvida e pede ao usuário que aprove esse acesso.
+
+A estratégia atual que estamos implementando autentica os usuários usando uma conta do GitHub e tokens OAuth 2.0. O ID do cliente e o segredo obtidos ao criar um aplicativo são fornecidos como opções ao criar a estratégia. A estratégia também requer uma função de callback `verify`, que recebe o token de acesso e o token de atualização opcional, bem como a função `profile`, que contém o perfil do usuário autenticado no GitHub. A função de callback `verify` deve chamar `cb` fornecendo um usuário para concluir a autenticação.
Saiba como a nova estratégia deve se parecer nesse momento:
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md
index f38d76616f5..460b75e2a51 100644
--- a/curriculum/challenges/portuguese/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md
@@ -206,10 +206,41 @@ assert(!!el && el.name === 'email')
O elemento `#nav-bar` deve estar sempre na parte superior da viewport.
```js
-const el = document.getElementById('nav-bar')
-const top1 = el?.offsetTop
-const top2 = el?.offsetTop
-assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
+(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);
+})();
```
A página inicial deve ter pelo menos uma media query.
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140cfc08ca9c5128c3e6478.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140cfc08ca9c5128c3e6478.md
index 53d8f84bdfe..a00602e399a 100644
--- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140cfc08ca9c5128c3e6478.md
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140cfc08ca9c5128c3e6478.md
@@ -7,7 +7,7 @@ dashedName: step-7
# --description--
-Defina a `position` do seletor `.line` para `absolute`, a pripiedade `left` para `50%` e a propriedade `top` para `50%`.
+Defina a `position` do seletor `.line` para `absolute`, a propiedade `left` para `50%` e a propriedade `top` para `50%`.
# --hints--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a1b2af494934b7ec1a72.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a1b2af494934b7ec1a72.md
index 48dcb560030..5274b39d3a4 100644
--- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a1b2af494934b7ec1a72.md
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a1b2af494934b7ec1a72.md
@@ -36,7 +36,7 @@ const blueMarkerChildren = [...document.querySelector('.blue')?.children];
assert(blueMarkerChildren.every(child => child?.localName === 'div') && blueMarkerChildren.length === 2);
```
-O elemento `div` da tampa verde deve estar antes do elemento `div` da capa.
+O elemento `div` da tampa azul deve estar antes do elemento `div` da capa.
```js
const blueMarkerChildren = [...document.querySelector('.blue')?.children];
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3952facd25a83fe8083.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3952facd25a83fe8083.md
index 83f2f809489..550d46bf29d 100644
--- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3952facd25a83fe8083.md
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3952facd25a83fe8083.md
@@ -17,7 +17,7 @@ Você deve adicionar uma nova `@media` query.
assert(new __helpers.CSSHelp(document).getCSSRules('media')?.length === 1);
```
-A nova `@media` query deverá ter uma `max-width` de `800px`.
+A nova `@media` query deve ter uma `max-width` de `800px` assim: `@media (max-width: 800px)`.
```js
assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[0]?.media?.mediaText === '(max-width: 800px)');
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3ebb4f7f05b8401b716.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3ebb4f7f05b8401b716.md
index 44695fedb70..8386797afb6 100644
--- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3ebb4f7f05b8401b716.md
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3ebb4f7f05b8401b716.md
@@ -21,13 +21,13 @@ Você deve ter uma segunda `@media` query.
assert(new __helpers.CSSHelp(document).getCSSRules('media')?.length === 2);
```
-Sua nova `@media` query deve vir depois da atual.
+Sua nova `@media` query deve vir depois da atual. Você deve ter uma regra `@media (max-width: 800px)`.
```js
assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[0]?.media?.mediaText === '(max-width: 800px)');
```
-Sua nova `@media` query deverá ter um `max-width` de `600px`.
+A nova `@media` query deve ter uma `max-width` de `600px` assim: `@media (max-width: 600px)`.
```js
assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[1]?.media?.mediaText === '(max-width: 600px)');
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969e7451455614217e901b.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969e7451455614217e901b.md
new file mode 100644
index 00000000000..fe9463f7091
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969e7451455614217e901b.md
@@ -0,0 +1,91 @@
+---
+id: 61969e7451455614217e901b
+title: Passo 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Para fazer com que a montanha pareça mais com uma montanha, você pode usar a função de transformação `skew`, que recebe dois argumentos. O primeiro é um ângulo para alinhar o eixo x e o segundo é um ângulo para alinhar o eixo y.
+
+Use a propriedade `transform` para alinhar a montanha em `0deg` no eixo x e `44deg` no eixo y.
+
+# --hints--
+
+Você deve dar a `.left-mountain` uma propriedade `transform`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.transform);
+```
+
+Você deve usar a função `skew` na `transform`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.transform, 'skew');
+```
+
+Você deve dar a `.left-mountain` uma `transform` de `skew(0deg, 44deg)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.getPropVal('transform', true), 'skew(0deg,44deg)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Penguin
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: clip;
+}
+
+--fcc-editable-region--
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d1ac33c68d27dcda5796.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d1ac33c68d27dcda5796.md
new file mode 100644
index 00000000000..b4f46e62980
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d1ac33c68d27dcda5796.md
@@ -0,0 +1,119 @@
+---
+id: 6196d1ac33c68d27dcda5796
+title: Passo 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Gire o elemento `.back-mountain` `45deg` no sentido horário. Então, dê a propriedade `left` de `110px` e uma propriedade `top` de `225px`.
+
+# --hints--
+
+Você deve usar a propriedade `transform` para girar o elemento.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.transform);
+```
+
+Você deve dar aos elementos `.back-mountain` um `transform` de `--fcc-expected--`, mas foi encontrado `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.transform, 'rotate(45deg)');
+```
+
+Você deve dar a `.back-mountain` uma propriedade `left`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.left);
+```
+
+Você deve dar à classe`.back-mountain` uma propriedade `left` de `--fcc-expected--`, mas foi encontrado `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.left, '110px');
+```
+
+Você deve dar a `.back-mountain` uma propriedade `top`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.top);
+```
+
+Você deve dar à classe`.back-mountain` uma propriedade `top` de `--fcc-expected--`, mas foi encontrado `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.top, '225px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Penguin
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: clip;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+--fcc-editable-region--
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993cf26a8e0f0a553db223.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993cf26a8e0f0a553db223.md
new file mode 100644
index 00000000000..e51592feb14
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993cf26a8e0f0a553db223.md
@@ -0,0 +1,122 @@
+---
+id: 61993cf26a8e0f0a553db223
+title: Passo 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+_A maioria_ dos pinguins não tem uma cabeça quadrada.
+
+Dê ao pinguim uma cabeça ligeiramente oval definindo o raio dos cantos superiores como `70%` e o raio dos cantos inferiores como `65%`.
+
+# --hints--
+
+Você deve dar a `.penguin-head` um `border-radius` de `70% 70% 65% 65%`.
+
+```js
+// Maybe check for individual border-radius properties?
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.borderRadius, '70% 70% 65% 65%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: clip;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+--fcc-editable-region--
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993dbb35adf30b10d49e38.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993dbb35adf30b10d49e38.md
new file mode 100644
index 00000000000..1c4685e3bc2
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993dbb35adf30b10d49e38.md
@@ -0,0 +1,139 @@
+---
+id: 61993dbb35adf30b10d49e38
+title: Passo 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Defina um elemento `.penguin-body` e dê a ele uma `width` de `53%` e uma `height` de `45%`. Então, defina o `background` como um gradiente linear de `45deg`, `rgb(134, 133, 133)` de `0%`, `rgb(234, 231, 231)` de `25%` e `white` de `67%`.
+
+# --hints--
+
+Você deve usar o seletor `.penguin-head`.
+
+```js
+assert.match(code, /\.penguin-body\s*\{/);
+```
+
+Você deve dar ao `.penguin-body` uma `width` de `--fcc-expected--`, mas foi encontrado `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.width, '53%');
+```
+
+Você deve dar ao `.penguin-body` uma `height` de `--fcc-expected--`, mas foi encontrado `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.height, '45%');
+```
+
+Você deve dar a `.penguin-body` um `background` de `linear-gradient(45deg, rgb(134, 133, 133) 0%, rgb(234, 231, 231) 25%, white 67%)`.
+
+```js
+assert.include(['linear-gradient(45deg,rgb(134,133,133)0%,rgb(234,231,231)25%,white67%)', 'rgba(0,0,0,0)linear-gradient(45deg,rgb(134,133,133)0%,rgb(234,231,231)25%,white67%)repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.penguin-body')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6ab779390f49148773bb.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6ab779390f49148773bb.md
new file mode 100644
index 00000000000..d44c5a48808
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6ab779390f49148773bb.md
@@ -0,0 +1,65 @@
+---
+id: 61fd6ab779390f49148773bb
+title: Passo 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Abaixo do elemento `h1`, crie um elemento `div`. Dê a ele um atributo `id` definido como `years`. Você quer que esse elemento específico esteja escondido dos leitores de tela, então dê a ele o atributo `aria-hidden` definido como `true`.
+
+# --hints--
+
+Você deve criar um elemento `div` após o elemento `h1`.
+
+```js
+assert(document.querySelector('h1')?.nextElementSibling?.localName === 'div');
+```
+
+O novo elemento `div` deve ter um atributo `id` definido como `years`.
+
+```js
+assert(document.querySelector('div')?.getAttribute('id') === 'years');
+```
+
+O novo elemento `div` deve ter o atributo `aria-hidden` definido como `true`.
+
+```js
+assert(document.querySelector('div')?.getAttribute('aria-hidden') === 'true');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6b7c83dbf54a08cf0498.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6b7c83dbf54a08cf0498.md
new file mode 100644
index 00000000000..d7e8aacf778
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6b7c83dbf54a08cf0498.md
@@ -0,0 +1,79 @@
+---
+id: 61fd6b7c83dbf54a08cf0498
+title: Passo 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Dentro do elemento `div`, adicione três elementos `span`. Dê a cada um deles um atributo `class` definido como `year` e adicione os textos a seguir (em ordem): `2019`, `2020` e `2021`.
+
+# --hints--
+
+O elemento `div` deve ter três elementos `span`.
+
+```js
+assert(document.querySelector('div')?.children?.length === 3);
+```
+
+Cada elemento `span` deve ter o atributo `class` definido como `year`.
+
+```js
+const spans = [...document.querySelector('div')?.children];
+spans.forEach(span => assert(span?.classList?.contains('year')));
+```
+
+O primeiro `span` deve ter o texto `2019`.
+
+```js
+assert(document.querySelector('div')?.children?.[0]?.textContent === '2019');
+```
+
+O segundo `span` deve ter o texto `2020`.
+
+```js
+assert(document.querySelector('div')?.children?.[1]?.textContent === '2020');
+```
+
+O terceiro `span` deve ter o texto `2021`.
+
+```js
+assert(document.querySelector('div')?.children?.[2]?.textContent === '2021');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6cc9475a784b7776233e.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6cc9475a784b7776233e.md
new file mode 100644
index 00000000000..31c335033f0
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6cc9475a784b7776233e.md
@@ -0,0 +1,80 @@
+---
+id: 61fd6cc9475a784b7776233e
+title: Passo 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Abaixo do elemento `div` existente, adicione um novo elemento `div` com a `class` definida como `table-wrap`. Este será o contêiner das suas tabelas.
+
+Dentro dela, adicione três elementos `table`. Você usará o CSS para estilizá-las em uma única tabela, mas usar tabelas separadas ajudará os leitores de tela a entender o fluxo do documento.
+
+# --hints--
+
+Você deve criar um elemento `div`.
+
+```js
+assert(document.querySelectorAll('div')?.length === 2);
+```
+
+O novo elemento `div` deve ter a `class` definida como `table-wrap`.
+
+```js
+assert(document.querySelector('.table-wrap')?.localName === 'div');
+```
+
+O elemento `.table-wrap` deve vir após o elemento `div` existente.
+
+```js
+assert(document.querySelectorAll('div')?.[1]?.classList?.contains('table-wrap'));
+```
+
+O elemento `.table-wrap` deve ter três elementos `table`.
+
+```js
+const children = [...(document.querySelector('.table-wrap')?.children ?? [])];
+assert(children?.length === 3);
+children.forEach(child => assert(child?.localName === 'table'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd719788899952e67692b9.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd719788899952e67692b9.md
new file mode 100644
index 00000000000..463aceb8b3d
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd719788899952e67692b9.md
@@ -0,0 +1,86 @@
+---
+id: 61fd719788899952e67692b9
+title: Passo 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Os elementos `thead` and `tbody` são usados para indicar qual porção da tabela é o cabeçalho e qual porção contém os dados primários ou o conteúdo.
+
+Adicione um `thead` e um `tbody` à primeira `table`, abaixo do elemento `caption`.
+
+# --hints--
+
+O primeiro elemento `table` deve ter um elemento `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[0]?.querySelector('thead'));
+```
+
+O primeiro elemento `table` deve ter um elemento `tbody`.
+
+```js
+assert(document.querySelectorAll('table')?.[0]?.querySelector('tbody'));
+```
+
+O elemento `thead` deve estar imediatamente abaixo do elemento `caption`.
+
+```js
+assert(document.querySelector('caption')?.nextElementSibling?.localName === 'thead');
+```
+
+O elemento `tbody` deve estar imediatamente abaixo do elemento `thead`.
+
+```js
+assert(document.querySelector('thead')?.nextElementSibling?.localName === 'tbody');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+--fcc-editable-region--
+
+
Assets
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd71d596e8f253b9408b39.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd71d596e8f253b9408b39.md
new file mode 100644
index 00000000000..f9baa9ba50c
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd71d596e8f253b9408b39.md
@@ -0,0 +1,86 @@
+---
+id: 61fd71d596e8f253b9408b39
+title: Passo 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+O elemento `tr` é usado para indicar uma linha de tabela. Adicione um elemento `tr` dentro do elemento `thead`. No novo elemento `tr`, adicione um elemento `td` seguido por três elementos `th`.
+
+O elemento `td` indica uma célula de dados, enquanto o elemento `th` indica uma célula do cabeçalho.
+
+# --hints--
+
+O elemento `thead` deve ter um elemento `tr`.
+
+```js
+assert(document.querySelector('thead')?.children?.[0]?.localName === 'tr');
+```
+
+O elemento `tr` deve ter um elemento `td` como primeiro filho.
+
+```js
+assert(document.querySelector('tr')?.children?.[0]?.localName === 'td');
+```
+
+O elemento `tr` deve ter três elementos `th` depois do elemento `td`.
+
+```js
+assert(document.querySelector('tr')?.children?.[1]?.localName === 'th');
+assert(document.querySelector('tr')?.children?.[2]?.localName === 'th');
+assert(document.querySelector('tr')?.children?.[3]?.localName === 'th');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd75ea7f663457612dba02.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd75ea7f663457612dba02.md
new file mode 100644
index 00000000000..9baa1581467
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd75ea7f663457612dba02.md
@@ -0,0 +1,125 @@
+---
+id: 61fd75ea7f663457612dba02
+title: Passo 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Dentro de cada um dos novos elementos `th`, aninhe um elemento `span` com o atributo `class` definido como `sr-only year`. Dê a eles os seguintes textos (em ordem): `2019`, `2020` e `2021`.
+
+Dê ao terceiro elemento `th` a `class` com o valor de `current`.
+
+Deixe o elemento `td` vazio. Esse elemento existe apenas para garantir que a tabela tenha um layout de quatro colunas e associar os cabeçalhos às colunas corretas.
+
+# --hints--
+
+Cada um dos elementos `th` deve ter um elemento `span`.
+
+```js
+const ths = [...document.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.length === 1);
+ assert(th?.children?.[0]?.localName === 'span');
+});
+```
+
+Cada um dos novos elementos `span` deve ter o atributo `class` com o valor `sr-only year`.
+
+```js
+const ths = [...document.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.[0]?.classList?.contains('sr-only'));
+ assert(th?.children?.[0]?.classList?.contains('year'));
+});
+```
+
+O primeiro elemento `span` deve ter o texto `2019`.
+
+```js
+assert(document.querySelectorAll('th')?.[0]?.children?.[0]?.textContent === '2019');
+```
+
+O segundo elemento `span` deve ter o texto `2020`.
+
+```js
+assert(document.querySelectorAll('th')?.[1]?.children?.[0]?.textContent === '2020');
+```
+
+O terceiro elemento `span` deve ter o texto `2021`.
+
+```js
+assert(document.querySelectorAll('th')?.[2]?.children?.[0]?.textContent === '2021');
+```
+
+O terceiro elemento `th` deve ter o atributo `class` com o valor `current`.
+
+```js
+assert(document.querySelector('table')?.querySelectorAll('th')?.[2]?.classList?.contains('current'));
+```
+
+O elemento `td` deve estar vazio.
+
+```js
+assert(document.querySelector('table')?.querySelectorAll('td')?.[0]?.textContent === '');
+assert(document.querySelector('table')?.querySelectorAll('td')?.[0]?.children?.length === 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7648a7ba2e5882436831.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7648a7ba2e5882436831.md
new file mode 100644
index 00000000000..820d11640c0
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7648a7ba2e5882436831.md
@@ -0,0 +1,96 @@
+---
+id: 61fd7648a7ba2e5882436831
+title: Passo 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Dentro do elemento `tbody`, adicione quatro elementos `tr`. Dê aos três primeiros um atributo `class` definido como `data` e ao quarto um atributo `class` definido como `total`.
+
+# --hints--
+
+O elemento `tbody` deve ter quatro elementos `tr`.
+
+```js
+const children = [...document.querySelector('tbody')?.children];
+assert(children?.length === 4);
+children.forEach(child => assert(child?.localName === 'tr'));
+```
+
+Os primeiros três elementos `tr` devem ter o atributo `class` definido como `data`.
+
+```js
+const children = [...document.querySelector('tbody')?.children];
+children.forEach((child, index) => {
+ if (index < 3) {
+ assert(child?.classList?.contains('data'));
+ }
+});
+```
+
+O quarto elemento `tr` deve ter o atributo `class` definido como `total`.
+
+```js
+const children = [...document.querySelector('tbody')?.children];
+assert(children?.[3]?.classList?.contains('total'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd778081276b59d59abad6.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd778081276b59d59abad6.md
new file mode 100644
index 00000000000..02a0aa35d4f
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd778081276b59d59abad6.md
@@ -0,0 +1,134 @@
+---
+id: 61fd778081276b59d59abad6
+title: Passo 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+No primeiro `tr`, adicione um elemento `th` com o texto `Cash This is the cash we currently have on hand.`. Envolva todo esse texto, exceto `Cash`, em um elemento `span` com a `class` definida como `description`.
+
+Depois disso, adicione três elementos `td` com os seguintes textos (em ordem): `$25`, `$30` e `$28`. Dê ao terceiro elemento `td` a `class` com o valor de `current`.
+
+# --hints--
+
+O primeiro `tr` deve ter um elemento `th`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th'));
+```
+
+O elemento `th` deve ter o texto `Cash This is the cash we currently have on hand.`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th')?.innerText === 'Cash This is the cash we currently have on hand.');
+```
+
+Você deve envolver o texto `This is the cash we currently have on hand.` em um elemento `span`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.textContent === 'This is the cash we currently have on hand.');
+```
+
+O elemento `span` deve ter o atributo `class` com o valor `description`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Você deve ter três elementos `td`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td').length === 3);
+```
+
+O primeiro elemento `td` deve ter o texto `$25`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[0]?.textContent === '$25');
+```
+
+O segundo elemento `td` deve ter o texto `$30`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[1]?.textContent === '$30');
+```
+
+O terceiro elemento `td` deve ter o texto `$28`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.textContent === '$28');
+```
+
+O terceiro elemento `td` deve ter o atributo `class` com o valor `current`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd77f7ad2aeb5ae34d07d6.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd77f7ad2aeb5ae34d07d6.md
new file mode 100644
index 00000000000..386247308b9
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd77f7ad2aeb5ae34d07d6.md
@@ -0,0 +1,138 @@
+---
+id: 61fd77f7ad2aeb5ae34d07d6
+title: Passo 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+No segundo elemento `tr`, adicione um elemento `th` com o texto `Checking Our primary transactional account.`. Envolva esse texto, exceto `Checking`, em um elemento `span` com o atributo `class` definido como `description`.
+
+Depois disso, adicione três elementos `td` com o seguinte texto (em ordem): `$54`, `$56`, `$53`. Dê ao terceiro elemento `td` a `class` com o valor de `current`.
+
+# --hints--
+
+O segundo elemento `tr` deve ter um elemento `th`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th'));
+```
+
+O elemento `th` deve ter o texto `Checking Our primary transactional account.`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th')?.innerText === 'Checking Our primary transactional account.');
+```
+
+Você deve emvolver o texto `Our primary transactional account.` em um elemento `span`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th > span')?.textContent === 'Our primary transactional account.');
+```
+
+O elemento `span` deve ter o atributo `class` com o valor `description`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Você deve ter três elementos `td`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td').length === 3);
+```
+
+O primeiro elemento `td` deve ter o texto `$54`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[0]?.textContent === '$54');
+```
+
+O segundo elemento `td` deve ter o texto `$56`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[1]?.textContent === '$56');
+```
+
+O terceiro elemento `td` deve ter o texto `$53`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[2]?.textContent === '$53');
+```
+
+O terceiro elemento `td` deve ter o atributo `class` com o valor `current`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7a160ed17960e971f28b.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7a160ed17960e971f28b.md
new file mode 100644
index 00000000000..46a56efd0e9
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7a160ed17960e971f28b.md
@@ -0,0 +1,140 @@
+---
+id: 61fd7a160ed17960e971f28b
+title: Passo 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+No quarto elemento `tr`, adicione um elemento `th` com o texto `Total Assets`. Envolva o texto `Assets` em um elemento `span` com o atributo `class` definido como `sr-only`.
+
+Depois disso, adicione três elementos `td` com o seguinte texto (em ordem): `$579`, `$736`, `$809`. Dê ao terceiro elemento `td` a `class` com o valor de `current`.
+
+# --hints--
+
+O quarto `tr` deve ter um elemento `th`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th'));
+```
+
+O elemento `th` deve conter o texto `Total Assets`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th')?.innerText === 'Total Assets');
+```
+
+Você deve envolver o texto `Assets` dentro de um elemento `span`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th > span')?.textContent === 'Assets');
+```
+
+O elemento `span` deve ter o atributo `class` com o valor `sr-only`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th > span')?.classList?.contains('sr-only'));
+```
+
+Você deve ter três elementos `td`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td').length === 3);
+```
+
+O primeiro elemento `td` deve ter o texto `$579`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[0]?.textContent === '$579');
+```
+
+O segundo elemento `td` deve ter o texto `$736`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[1]?.textContent === '$736');
+```
+
+O terceiro elemento `td` deve ter o texto `$809`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[2]?.textContent === '$809');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7b3fcaa5406257abc5d1.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7b3fcaa5406257abc5d1.md
new file mode 100644
index 00000000000..131edd62ab8
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7b3fcaa5406257abc5d1.md
@@ -0,0 +1,130 @@
+---
+id: 61fd7b3fcaa5406257abc5d1
+title: Passo 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Hora de passar para a segunda tabela. Comece dando a ela um elemento `caption` definido como `Liabilities`. Em seguida, adicione `thead` e `tbody`.
+
+# --hints--
+
+O segundo elemento `table` deve ter um elemento `caption`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.children?.[0]?.localName === 'caption');
+```
+
+O elemento `caption` dever ter o texto `Liabilities`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('caption')?.textContent === 'Liabilities');
+```
+
+O segundo elemento `table` deve ter um elemento `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('thead'));
+```
+
+O segundo elemento `table` deve ter um elemento `tbody`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody'));
+```
+
+O elemento `thead` deve estar imediatamente abaixo do elemento `caption`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('caption')?.nextElementSibling?.localName === 'thead');
+```
+
+O elemento `tbody` deve estar imediatamente abaixo do elemento `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('thead')?.nextElementSibling?.localName === 'tbody');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8e491324ce717da97ffe.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8e491324ce717da97ffe.md
new file mode 100644
index 00000000000..5000d64c0bd
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8e491324ce717da97ffe.md
@@ -0,0 +1,119 @@
+---
+id: 61fd8e491324ce717da97ffe
+title: Passo 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Dentro do `thead`, adicione um `tr`. Dentro dele, adicione um `td` e três elementos `th`.
+
+# --hints--
+
+O elemento `thead` deve ter um elemento `tr`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('thead')?.children?.[0]?.localName === 'tr');
+```
+
+O elemento `tr` deve ter um elemento `td` como primeiro filho.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tr')?.children?.[0]?.localName === 'td');
+```
+
+O elemento `tr` deve ter três elementos `th` depois do elemento `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tr')?.children?.[1]?.localName === 'th');
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tr')?.children?.[2]?.localName === 'th');
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tr')?.children?.[3]?.localName === 'th');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+--fcc-editable-region--
+
+
Liabilities
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8fd08af43372f02952d0.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8fd08af43372f02952d0.md
new file mode 100644
index 00000000000..1563d4beeae
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8fd08af43372f02952d0.md
@@ -0,0 +1,149 @@
+---
+id: 61fd8fd08af43372f02952d0
+title: Passo 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Dê a cada um dos elementos `th` um elemento `span` com a classe definida como `sr-only` e os seguintes textos, em ordem: `2019`, `2020` e `2021`.
+
+# --hints--
+
+Cada um dos elementos `th` deve ter um elemento `span`.
+
+```js
+const ths = [...document.querySelectorAll('table')?.[1]?.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.length === 1);
+ assert(th?.children?.[0]?.localName === 'span');
+});
+```
+
+Cada um dos novos elementos `span` deve ter o atributo `class` com o valor `sr-only`.
+
+```js
+const ths = [...document.querySelectorAll('table')?.[1]?.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.[0]?.classList?.contains('sr-only'));
+});
+```
+
+O primeiro elemento `span` deve ter o texto `2019`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('th')?.[0]?.children?.[0]?.textContent === '2019');
+```
+
+O segundo elemento `span` deve ter o texto `2020`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('th')?.[1]?.children?.[0]?.textContent === '2020');
+```
+
+O terceiro elemento `span` deve ter o texto `2021`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('th')?.[2]?.children?.[0]?.textContent === '2021');
+```
+
+O elemento `td` deve estar vazio.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('td')?.[0]?.textContent === '');
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('td')?.[0]?.children?.length === 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+--fcc-editable-region--
+
+
Liabilities
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9126aa72a474301fc49f.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9126aa72a474301fc49f.md
new file mode 100644
index 00000000000..427ebba3b4a
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9126aa72a474301fc49f.md
@@ -0,0 +1,131 @@
+---
+id: 61fd9126aa72a474301fc49f
+title: Passo 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Dentro do elemento `tbody`, adicione quatro elementos `tr`. Dê aos três primeiros um atributo `class` definido como `data` e ao quarto um atributo `class` definido como `total`.
+
+# --hints--
+
+O elemento `tbody` deve ter quatro elementos `tr`.
+
+```js
+const children = [...document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.children];
+assert(children?.length === 4);
+children.forEach(child => assert(child?.localName === 'tr'));
+```
+
+Os primeiros três elementos `tr` devem ter o atributo `class` definido como `data`.
+
+```js
+const children = [...document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.children];
+children.forEach((child, index) => {
+ if (index < 3) {
+ assert(child?.classList?.contains('data'));
+ }
+});
+```
+
+O quarto elemento `tr` deve ter o atributo `class` definido como `total`.
+
+```js
+const children = [...document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.children];
+assert(children?.[3]?.classList?.contains('total'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+--fcc-editable-region--
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd986ddbcbd47ba8fbc5ec.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd986ddbcbd47ba8fbc5ec.md
new file mode 100644
index 00000000000..4eac2047861
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd986ddbcbd47ba8fbc5ec.md
@@ -0,0 +1,177 @@
+---
+id: 61fd986ddbcbd47ba8fbc5ec
+title: Passo 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Dentro do terceiro `tr`, adicione um elemento `th` com o texto `Credit The outstanding balance on our credit card.`. Envolva esse texto, exceto `Credit`, em um elemento `span` com a `class` definida como `description`.
+
+Adicione três elementos `td` abaixo disso e insira neles os seguintes textos, respectivamente: `$50`, `$50` e `$75`. No terceiro elemento `td`, adicione uma `class` com o valor `current`.
+
+# --hints--
+
+O terceiro `tr` deve ter um elemento `th`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th'));
+```
+
+O elemento `th` deve ter o texto `Credit The outstanding balance on our credit card.`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th')?.innerText === 'Credit The outstanding balance on our credit card.');
+```
+
+Você deve envolver o texto `The outstanding balance on our credit card.` dentro de um elemento `span`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th > span')?.textContent === 'The outstanding balance on our credit card.');
+```
+
+O elemento `span` deve ter o atributo `class` com o valor `description`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Você deve ter três elementos `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td').length === 3);
+```
+
+O primeiro elemento `td` deve ter o texto `$50`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[0]?.textContent === '$50');
+```
+
+O segundo elemento `td` deve ter o texto `$50`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[1]?.textContent === '$50');
+```
+
+O terceiro elemento `td` deve ter o texto `$75`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[2]?.textContent === '$75');
+```
+
+O terceiro elemento `td` deve ter o atributo `class` com o valor `current`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+--fcc-editable-region--
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd990577d8227dd93fbeeb.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd990577d8227dd93fbeeb.md
new file mode 100644
index 00000000000..6f2a8d8882d
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd990577d8227dd93fbeeb.md
@@ -0,0 +1,181 @@
+---
+id: 61fd990577d8227dd93fbeeb
+title: Passo 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+No quarto elemento `tr`, adicione um elemento `th` com o texto `Total Liabilities`. Envolva o texto `Liabilities` em um elemento `span` com o atributo `class` definido como `sr-only`.
+
+Depois disso, adicione três elementos `td` com o seguinte texto (em ordem): `$750`, `$600`, `$475`. Dê ao terceiro elemento `td` a `class` com o valor de `current`.
+
+# --hints--
+
+O quarto `tr` deve ter um elemento `th`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th'));
+```
+
+O elemento `th` deve conter o texto `Total Liabilities`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th')?.innerText === 'Total Liabilities');
+```
+
+Você deve colocar o texto `Liabilities` dentro de um elemento `span`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th > span')?.textContent === 'Liabilities');
+```
+
+O elemento `span` deve ter o atributo `class` com o valor `sr-only`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th > span')?.classList?.contains('sr-only'));
+```
+
+Você deve ter três elementos `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td').length === 3);
+```
+
+O primeiro elemento `td` deve ter o texto `$750`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[0]?.textContent === '$750');
+```
+
+O segundo elemento `td` deve ter o texto `$600`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[1]?.textContent === '$600');
+```
+
+O terceiro elemento `td` deve ter o texto `$475`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[2]?.textContent === '$475');
+```
+
+O terceiro elemento `td` deve ter o atributo `class` com o valor `current`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+--fcc-editable-region--
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9a4ff2fc4481b9157bd7.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9a4ff2fc4481b9157bd7.md
new file mode 100644
index 00000000000..3125080ad35
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9a4ff2fc4481b9157bd7.md
@@ -0,0 +1,165 @@
+---
+id: 61fd9a4ff2fc4481b9157bd7
+title: Passo 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Para a terceira tabela, adicione uma `caption` com o texto `Net Worth` e defina um cabeçalho e um corpo de tabela.
+
+# --hints--
+
+O terceiro elemento `table` deve ter um elemento `caption`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.children?.[0]?.localName === 'caption');
+```
+
+O elemento `caption` dever ter o texto `Net Worth`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('caption')?.textContent === 'Net Worth');
+```
+
+O terceiro elemento `table` deve ter um elemento `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('thead'));
+```
+
+O terceiro elemento `table` deve ter um elemento `tbody`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody'));
+```
+
+O elemento `thead` deve estar imediatamente abaixo do elemento `caption`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('caption')?.nextElementSibling?.localName === 'thead');
+```
+
+O elemento `tbody` deve estar imediatamente abaixo do elemento `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('thead')?.nextElementSibling?.localName === 'tbody');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9ad665a4a282c8106be3.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9ad665a4a282c8106be3.md
new file mode 100644
index 00000000000..0a8f15cd590
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9ad665a4a282c8106be3.md
@@ -0,0 +1,198 @@
+---
+id: 61fd9ad665a4a282c8106be3
+title: Passo 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Dentro do `thead`, crie um elemento `tr`. Dentro dele, adicione um `td` e três elementos `th`. Dentro de cada um dos elementos `th`, adicione um elemento `span` com a `class` definida como `sr-only` e os seguintes textos, em ordem: `2019`, `2020` e `2021`.
+
+# --hints--
+
+O elemento `thead` deve ter um elemento `tr`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('thead')?.children?.[0]?.localName === 'tr');
+```
+
+O elemento `tr` deve ter um elemento `td` como primeiro filho.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tr')?.children?.[0]?.localName === 'td');
+```
+
+O elemento `tr` deve ter três elementos `th` depois do elemento `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tr')?.children?.[1]?.localName === 'th');
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tr')?.children?.[2]?.localName === 'th');
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tr')?.children?.[3]?.localName === 'th');
+```
+
+Cada um dos elementos `th` deve ter um elemento `span`.
+
+```js
+const ths = [...document.querySelectorAll('table')?.[2]?.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.length === 1);
+ assert(th?.children?.[0]?.localName === 'span');
+});
+```
+
+Cada um dos novos elementos `span` deve ter o atributo `class` com o valor `sr-only`.
+
+```js
+const ths = [...document.querySelectorAll('table')?.[2]?.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.[0]?.classList?.contains('sr-only'));
+});
+```
+
+O primeiro elemento `span` deve ter o texto `2019`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('th')?.[0]?.children?.[0]?.textContent === '2019');
+```
+
+O segundo elemento `span` deve ter o texto `2020`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('th')?.[1]?.children?.[0]?.textContent === '2020');
+```
+
+O terceiro elemento `span` deve ter o texto `2021`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('th')?.[2]?.children?.[0]?.textContent === '2021');
+```
+
+O elemento `td` deve estar vazio.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('td')?.[0]?.textContent === '');
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('td')?.[0]?.children?.length === 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+--fcc-editable-region--
+
+
Net Worth
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9b7285bde783ad5b8aac.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9b7285bde783ad5b8aac.md
new file mode 100644
index 00000000000..79979d1bf00
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9b7285bde783ad5b8aac.md
@@ -0,0 +1,208 @@
+---
+id: 61fd9b7285bde783ad5b8aac
+title: Passo 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Dentro de `tbody`, adicione uma `tr` com a `class` `total`. Nela, adicione um `th` com o texto `Total Net Worth` e envolva `Net Worth` em um `span` com a `class` definida como `sr-only`.
+
+Em seguida, adicione três elementos `td`, dando ao terceiro uma `class` definida como `current` e dando a cada uma o texto a seguir: `$-171`, `$136` e `$334`.
+
+# --hints--
+
+O elemento `tbody` deve ter um elemento `tr`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.length === 1);
+```
+
+O elemento `tr` deve ter a `class` definida como `total`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelector('tr')?.classList?.contains('total'));
+```
+
+O `tr` deve ter um elemento `th`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th'));
+```
+
+O elemento `th` deve conter o texto `Total Net Worth`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th')?.innerText === 'Total Net Worth');
+```
+
+Você deve envolver o texto `Net Worth` dentro de um elemento `span`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.textContent === 'Net Worth');
+```
+
+O elemento `span` deve ter o atributo `class` com o valor `sr-only`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.classList?.contains('sr-only'));
+```
+
+Você deve ter três elementos `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td').length === 3);
+```
+
+O primeiro elemento `td` deve ter o texto `$-171`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[0]?.textContent === '$-171');
+```
+
+O segundo elemento `td` deve ter o texto `$136`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[1]?.textContent === '$136');
+```
+
+O terceiro elemento `td` deve ter o texto `$334`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.textContent === '$334');
+```
+
+O terceiro elemento `td` deve ter a `class` definida como `current`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+--fcc-editable-region--
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9d9fbdfe078800317055.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9d9fbdfe078800317055.md
new file mode 100644
index 00000000000..51be3657153
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9d9fbdfe078800317055.md
@@ -0,0 +1,158 @@
+---
+id: 61fd9d9fbdfe078800317055
+title: Passo 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Hora de estilizar a sua tabela. Comece redefinindo o modelo de caixa. Crie um seletor `html` e dê a ele uma propriedade `box-sizing` definida como `border-box`.
+
+# --hints--
+
+Você deve ter um seletor `html`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html'));
+```
+
+O seletor `html` deve ter a propriedade `box-sizing` definida como `border-box`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html')?.getPropertyValue('box-sizing') === 'border-box');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda307bde0b091cf7d884a.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda307bde0b091cf7d884a.md
new file mode 100644
index 00000000000..8561337af67
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda307bde0b091cf7d884a.md
@@ -0,0 +1,168 @@
+---
+id: 61fda307bde0b091cf7d884a
+title: Passo 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Crie um seletor `body` e dê a ele a propriedade `font-family` definida como `sans-serif` e a propriedade `color` definida como `#0a0a23`.
+
+# --hints--
+
+Você deve ter um seletor `body`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+O seletor `body` deve ter a propriedade `font-family` com o valor `sans-serif`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.getPropertyValue('font-family') === 'sans-serif');
+```
+
+O seletor `body` deve ter a propriedade `color` definida como `#0a0a23`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.getPropertyValue('color') === 'rgb(10, 10, 35)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda339eadcfd92a6812bed.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda339eadcfd92a6812bed.md
new file mode 100644
index 00000000000..c30fb7f155f
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda339eadcfd92a6812bed.md
@@ -0,0 +1,171 @@
+---
+id: 61fda339eadcfd92a6812bed
+title: Passo 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Antes de irmos muito mais longe na estilização, devemos usar a classe `sr-only`. Você pode usar o CSS para tornar os elementos dessa classe completamente ocultos na página visual, mas ainda podendo ser anunciados pelos leitores de tela.
+
+O CSS que você está prestes a escrever é um conjunto comum de propriedades usadas para garantir que os elementos estejam completamente ocultos visualmente.
+
+O seletor `span[class~="sr-only"]` selecionará qualquer elemento `span` cujo atributo `class` *inclua* `sr-only`. Crie esse seletor e dê a ele uma propriedade `border` definida como `0`.
+
+# --hints--
+
+Você deve ter um seletor `span[class~="sr-only"]`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]'));
+```
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `border` definida como `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('border-width') === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdac1e31692f9a9ad97295.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdac1e31692f9a9ad97295.md
new file mode 100644
index 00000000000..c7a97b241c0
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdac1e31692f9a9ad97295.md
@@ -0,0 +1,178 @@
+---
+id: 61fdac1e31692f9a9ad97295
+title: Passo 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+A propriedade `clip` do CSS é usada para definir porções visíveis de um elemento. Defina o seletor `span[class~="sr-only"]` para que tenha uma propriedade `clip` de `rect(1px, 1px, 1px, 1px)`.
+
+A propriedade `clip-path` determina a forma que a propriedade `clip` receberá. Use os seletores `clip-path` e `-webkit-clip-path` para definir o valor como `inset(50%)`, deixando o clip-path na forma de um retângulo dentro do elemento.
+
+# --hints--
+
+O seletor `span[class~="sr-only"]` deve ter uma propriedade `clip` definida como `rect(1px, 1px, 1px, 1px)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('clip') === 'rect(1px, 1px, 1px, 1px)');
+```
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `clip-path` definida como `inset(50%)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('clip-path') === 'inset(50%)');
+```
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `-webkit-clip-path` definida como `inset(50%)`.
+
+```js
+assert(/-webkit-clip-path\s*:\s*inset\(\s*50%\s*\)\s*(;|})/.test(code));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaea3999cb19d76ce717b.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaea3999cb19d76ce717b.md
new file mode 100644
index 00000000000..39bfd3e11f1
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaea3999cb19d76ce717b.md
@@ -0,0 +1,173 @@
+---
+id: 61fdaea3999cb19d76ce717b
+title: Passo 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Agora, você precisa reduzir esses elementos. Dê ao seletor `span[class~="sr-only"]` as propriedades `width` e `height` definidas como `1px`.
+
+# --hints--
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `width` definida como `1px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('width') === '1px');
+```
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `height` definida como `1px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('height') === '1px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ -webkit-clip-path: inset(50%);
+
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaf9ff894b6a084ecdc1b.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaf9ff894b6a084ecdc1b.md
new file mode 100644
index 00000000000..0786830cad3
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaf9ff894b6a084ecdc1b.md
@@ -0,0 +1,175 @@
+---
+id: 61fdaf9ff894b6a084ecdc1b
+title: Passo 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Para evitar que o conteúdo do texto exceda os limites, dê ao seletor `span[class~="sr-only"]` uma propriedade `overflow` definida como `hidden` e uma propriedade `white-space` definida como `nowrap`.
+
+# --hints--
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `overflow` definida como `hidden`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('overflow') === 'hidden');
+```
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `white-space` definida como `nowrap`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('white-space') === 'nowrap');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ -webkit-clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdafe6f07fd7a1c6785bc2.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdafe6f07fd7a1c6785bc2.md
new file mode 100644
index 00000000000..e43f0a511e1
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdafe6f07fd7a1c6785bc2.md
@@ -0,0 +1,183 @@
+---
+id: 61fdafe6f07fd7a1c6785bc2
+title: Passo 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Por último, é necessário retirar estes elementos ocultos do fluxo do documento. Dê ao seletor `span[class~="sr-only"]` a propriedade `position` definida como `absolute`, a propiedade `padding` definida como `0` e a propriedade `margin` definida como `-1px`. Isso garantirá que não somente eles deixaram de ser visíveis, como também não estarão sequer na exibição de página.
+
+# --hints--
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `position` definida como `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('position') === 'absolute');
+```
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `padding` definida como `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('padding') === '0px');
+```
+
+O seletor `span[class~="sr-only"]` deve ter a propriedade `margin` definida como `-1px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('margin') === '-1px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ -webkit-clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ overflow: hidden;
+ white-space: nowrap;
+
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdb04d9939f0a26ca51c2b.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdb04d9939f0a26ca51c2b.md
new file mode 100644
index 00000000000..a84e18ba04e
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdb04d9939f0a26ca51c2b.md
@@ -0,0 +1,193 @@
+---
+id: 61fdb04d9939f0a26ca51c2b
+title: Passo 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Hora de estilizar o cabeçalho da tabela. Crie um seletor `h1`. Dê a ele uma propriedade `max-width` definida como `37.25rem`, uma propriedade `margin` definida como `0 auto` e uma propriedade `padding` definida como `1.5rem 1.25rem`.
+
+# --hints--
+
+Você deve ter um seletor `h1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1'));
+```
+
+O seletor `h1` deve ter a propriedade `max-width` definida como `37.25rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.getPropertyValue('max-width') === '37.25rem');
+```
+
+O seletor `h1` deve ter uma propriedade `margin` definida como `0 auto`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.getPropertyValue('margin') === '0px auto');
+```
+
+O seletor `h1` deve ter a propriedade `padding` definida como `1.5rem 1.25rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.getPropertyValue('padding') === '1.5rem 1.25rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ -webkit-clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620159cd5431aa34bc6a4c9c.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620159cd5431aa34bc6a4c9c.md
new file mode 100644
index 00000000000..cc843245194
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620159cd5431aa34bc6a4c9c.md
@@ -0,0 +1,199 @@
+---
+id: 620159cd5431aa34bc6a4c9c
+title: Passo 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Selecione o contêiner flex com um seletor `h1 .flex`. Dê a ele uma propriedade `display` definida como `flex` para ativar o layout do flexbox. Então, defina a propriedade `flex-direction` como `column-reverse` - isso exibirá os elementos aninhados da parte inferior para a superior. Por fim, defina a propriedade `gap` como `1rem` para fornecer mais espaçamento entre os elementos.
+
+# --hints--
+
+Você deve ter um seletor `h1 .flex`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex'));
+```
+
+O seletor `h1 .flex` deve ter a propriedade `display` definida como `flex`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex')?.getPropertyValue('display') === 'flex');
+```
+
+O seletor `h1 .flex` deve ter a propriedade `flex-direction` definida como `column-reverse`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex')?.getPropertyValue('flex-direction') === 'column-reverse');
+```
+
+O seletor `h1 .flex` deve ter a propriedade `gap` definida como `1rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex')?.getPropertyValue('gap') === '1rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ -webkit-clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015a5da1c95c358f079ebb.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015a5da1c95c358f079ebb.md
new file mode 100644
index 00000000000..2d286890bf8
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015a5da1c95c358f079ebb.md
@@ -0,0 +1,195 @@
+---
+id: 62015a5da1c95c358f079ebb
+title: Passo 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+O pseudosseletor `:first-of-type` é utilizado para focar no primeiro elemento que corresponde ao seletor. Crie um seletor `h1 .flex span:first-of-type` para escolher o primeiro elemento `span` no contêiner `.flex`. Lembre-se de que os elementos `span` estão invertidos visualmente, então esse parecerá ser o segundo elemento na página.
+
+Dê ao novo seletor uma propriedade `font-size` de `0.7em` para que ele pareça com um subtítulo.
+
+# --hints--
+
+Você deve ter um seletor `h1 .flex span:first-of-type`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex span:first-of-type'));
+```
+
+O seletor `h1 .flex span:first-of-type` deve ter a propriedade `font-size` definida como `0.7em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex span:first-of-type')?.getPropertyValue('font-size') === '0.7em');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ -webkit-clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015cd2654a1139321a89d2.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015cd2654a1139321a89d2.md
new file mode 100644
index 00000000000..0074cbcfcdf
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015cd2654a1139321a89d2.md
@@ -0,0 +1,197 @@
+---
+id: 62015cd2654a1139321a89d2
+title: Passo 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+O pseudosseletor `:last-of-type` é utilizado para focar exatamente o oposto: o último elemento que corresponde ao seletor. Crie um seletor `h1 .flex span:last-of-type` para focar no último `span` em seu contêiner flex e dê a ele uma propriedade `font-size` definida como `1.2em` para que se pareça com um cabeçalho.
+
+# --hints--
+
+Você deve ter um seletor `h1 .flex span:last-of-type`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex span:last-of-type'));
+```
+
+O seletor `h1 .flex span:last-of-type` deve ter a propriedade `font-size` definida como `1.2em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex span:last-of-type')?.getPropertyValue('font-size') === '1.2em');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ -webkit-clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015d8942384c3aed48329e.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015d8942384c3aed48329e.md
new file mode 100644
index 00000000000..a3b5f687699
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015d8942384c3aed48329e.md
@@ -0,0 +1,213 @@
+---
+id: 62015d8942384c3aed48329e
+title: Passo 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Você envolveu a tabela em um elemento de seção - agora você pode estilizá-la para dar a ela uma borda. Crie um seletor `section` e dê a ele uma propriedade `max-width` definida como `40rem` para deixar o design responsivo. Defina a propriedade `margin` como `0 auto` para centralizá-la e defina a propriedade `border` como `2px solid #d0d0d5`.
+
+# --hints--
+
+Você deve ter um seletor `section`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('section'));
+```
+
+O seletor `section` deve ter a propriedade `max-width` definida como `40rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('section')?.getPropertyValue('max-width') === '40rem');
+```
+
+O seletor `section` deve ter a propriedade `margin` definida como `0 auto`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('section')?.getPropertyValue('margin') === '0px auto');
+```
+
+O seletor `section` deve ter a propriedade `border` definida para `2px solid #d0d0d5`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('section')?.getPropertyValue('border') === '2px solid rgb(208, 208, 213)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ -webkit-clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620167374bb8b4455cd11125.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620167374bb8b4455cd11125.md
new file mode 100644
index 00000000000..5b80c9bb5bd
--- /dev/null
+++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620167374bb8b4455cd11125.md
@@ -0,0 +1,225 @@
+---
+id: 620167374bb8b4455cd11125
+title: Passo 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+A última parte da tabela são os anos. Crie um seletor `#years` e ative o flexbox. Justifique o conteúdo para o final da direção do flex e faça com que o elemento permaneça no lugar. Prenda o elemento na parte superior do contêiner com `top: 0`.
+
+# --hints--
+
+Você deve ter um seletor `#years`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years'));
+```
+
+O seletor `#years` deve ter a propriedade `display` definida como `flex`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('display') === 'flex');
+```
+
+O seletor `#years` deve ter uma propriedade `justify-content` definida para `flex-end`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('justify-content') === 'flex-end');
+```
+
+O seletor `#years` deve ter a propriedade `position` definida como `sticky`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('position') === 'sticky');
+```
+
+O seletor `#years` deve ter a propriedade `top` definida como `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('top') === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
Assets
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Cash This is the cash we currently have on hand.
+
$25
+
$30
+
$28
+
+
+
Checking Our primary transactional account.
+
$54
+
$56
+
$53
+
+
+
Savings Funds set aside for emergencies.
+
$500
+
$650
+
$728
+
+
+
Total Assets
+
$579
+
$736
+
$809
+
+
+
+
+
Liabilities
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
Loans The outstanding balance on our startup loan.
+
$500
+
$250
+
$0
+
+
+
Expenses Annual anticipated expenses, such as payroll.
+
$200
+
$300
+
$400
+
+
+
Credit The outstanding balance on our credit card.
+
$50
+
$50
+
$75
+
+
+
Total Liabilities
+
$750
+
$600
+
$475
+
+
+
+
+
Net Worth
+
+
+
+
2019
+
2020
+
2021
+
+
+
+
+
Total Net Worth
+
$-171
+
$136
+
$334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ -webkit-clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ z-index: 999;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+td.current {
+ font-style: italic;
+}
+
+tr.data {
+ background-image: linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem);
+}
+
+tr.data th {
+ text-align: left;
+ padding-top: 0.3rem;
+ padding-left: 0.5rem;
+}
+
+tr.data th .description {
+ display: block;
+ font-weight: normal;
+ font-style: italic;
+ padding: 1rem 0 0.75rem;
+ margin-right: -13.5rem;
+}
+
+tr.data td {
+ vertical-align: top;
+ padding: 0.3rem 0.25rem 0;
+ text-align: right;
+}
+
+tr.data td:last-of-type {
+ padding-right: 0.5rem;
+}
+```
+
diff --git a/curriculum/challenges/portuguese/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md b/curriculum/challenges/portuguese/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md
index caf1b687059..8112f448889 100644
--- a/curriculum/challenges/portuguese/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md
+++ b/curriculum/challenges/portuguese/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md
@@ -10,9 +10,9 @@ dashedName: build-a-caesars-cipher
Uma das cifras mais simples e mais conhecidas é a cifra de César, também conhecida como uma cifra de mudança. Em uma cifra de transferência, os significados das letras são deslocados de acordo com a quantidade definida.
-Um uso moderno comum é a cifra [ROT13](https://en.wikipedia.org/wiki/ROT13), onde os valores das letras são deslocados em 13 lugares. Da seguinte forma: `A ↔ N`, `B ↔ O` e assim por diante.
+Um uso moderno comum é a cifra [ROT13](https://www.freecodecamp.org/news/how-to-code-the-caesar-cipher-an-introduction-to-basic-encryption-3bf77b4e19f7/), onde os valores das letras são deslocados em 13 lugares. Da seguinte forma: `A ↔ N`, `B ↔ O` e assim por diante.
-Escreva uma função que recebe uma string codificada de [ROT13](https://en.wikipedia.org/wiki/ROT13) como entrada e retorna uma string decodificada.
+Escreva uma função que recebe uma string codificada de [ROT13](https://www.freecodecamp.org/news/how-to-code-the-caesar-cipher-an-introduction-to-basic-encryption-3bf77b4e19f7/) como entrada e retorna uma string decodificada.
Todas as letras serão maiúsculas. Não transforme nenhum caractere não-alfabético (ou seja, espaços, pontuação), mas passe por eles.
diff --git a/curriculum/challenges/portuguese/15-javascript-algorithms-and-data-structures-22/build-a-roman-numeral-converter-project/roman-numeral-converter.md b/curriculum/challenges/portuguese/15-javascript-algorithms-and-data-structures-22/build-a-roman-numeral-converter-project/roman-numeral-converter.md
index 5fa7cd310dc..a0a0f280ab2 100644
--- a/curriculum/challenges/portuguese/15-javascript-algorithms-and-data-structures-22/build-a-roman-numeral-converter-project/roman-numeral-converter.md
+++ b/curriculum/challenges/portuguese/15-javascript-algorithms-and-data-structures-22/build-a-roman-numeral-converter-project/roman-numeral-converter.md
@@ -10,7 +10,23 @@ dashedName: build-a-roman-numeral-converter
Converta o número dado em um número romano.
-Todas as respostas de [números romanos](http://www.mathsisfun.com/roman-numerals.html) devem ser fornecidas em maiúsculas.
+| Números romanos | Números arábicos |
+| --------------- | ---------------- |
+| M | 1000 |
+| CM | 900 |
+| D | 500 |
+| CD | 400 |
+| C | 100 |
+| XC | 90 |
+| L | 50 |
+| XL | 40 |
+| X | 10 |
+| IX | 0 |
+| V | 5 |
+| IV | 4 |
+| I | 1 |
+
+Todos os números romanos devem ser em maiúsculas.
# --hints--
diff --git a/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md b/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
index cbcfa558d39..3523aab691a 100644
--- a/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
+++ b/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/basic-javascript/manipulating-complex-objects.md
@@ -29,21 +29,7 @@ const ourMusic = [
];
```
-Це масив, який містить один об'єкт всередині. Об'єкт має різні частини metadata про альбом. Він також має вкладений масив `formats`. Якщо ви хочете додати більше записів в альбом, це можна зробити, додавши записи до масиву верхнього рівня. Об'єкти зберігають дані у властивості, яка має формат ключ-значення. У прикладі вище, `"artist": "Daft Punk"` - це властивість, що має ключ `artist` і значення `Daft Punk`. [JavaScript Object Notation](http://www.json.org/) або `JSON` є форматом відповідного обміну даними, який використовується для зберігання даних.
-
-```json
-{
- "artist": "Daft Punk",
- "title": "Homework",
- "release_year": 1997,
- "formats": [
- "CD",
- "Cassette",
- "LP"
- ],
- "gold": true
-}
-```
+Це масив, який містить один об'єкт всередині. Об'єкт має різні частини metadata про альбом. Він також має вкладений масив `formats`. Якщо ви хочете додати більше записів в альбом, це можна зробити, додавши записи до масиву верхнього рівня. Об'єкти зберігають дані у властивості, яка має формат ключ-значення. У прикладі вище, `"artist": "Daft Punk"` - це властивість, що має ключ `artist` і значення `Daft Punk`.
**Примітка:** Вам потрібно буде розмістити кому після кожного об'єкта в масиві, якщо він не є останнім його об'єктом.