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 cdd62359751..74d2c335c12 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
@@ -1,6 +1,6 @@
---
id: 587d78af367417b2b2512b04
-title: Build a Product Landing Page
+title: 製作一個產品登錄頁
challengeType: 14
forumTopicId: 301144
dashedName: build-a-product-landing-page
@@ -8,87 +8,87 @@ dashedName: build-a-product-landing-page
# --description--
-**Objective:** Build an app that is functionally similar to https://product-landing-page.freecodecamp.rocks
+**目標:** 構建一個功能類似於 https://product-landing-page.freecodecamp.rocks 的應用程序
-**User Stories:**
+**需求:**
-1. Your product landing page should have a `header` element with a corresponding `id="header"`
-1. You can see an image within the `header` element with a corresponding `id="header-img"` (A logo would make a good image here)
-1. Within the `#header` element, you can see a `nav` element with a corresponding `id="nav-bar"`
-1. You can see at least three clickable elements inside the `nav` element, each with the class `nav-link`
-1. When you click a `.nav-link` button in the `nav` element, you are taken to the corresponding section of the landing page
-1. You can watch an embedded product video with `id="video"`
-1. Your landing page has a `form` element with a corresponding `id="form"`
-1. Within the form, there is an `input` field with `id="email"` where you can enter an email address
-1. The `#email` input field should have placeholder text to let users know what the field is for
-1. The `#email` input field uses HTML5 validation to confirm that the entered text is an email address
-1. Within the form, there is a submit `input` with a corresponding `id="submit"`
-1. When you click the `#submit` element, the email is submitted to a static page (use this mock URL: `https://www.freecodecamp.com/email-submit`)
-1. The navbar should always be at the top of the viewport
-1. Your product landing page should have at least one media query
-1. Your product landing page should utilize CSS flexbox at least once
+1. 你的產品登錄頁應該有一個 `id="header"` 的 `header` 元素
+1. 你可以在 `header` 元素中看到一個 `id="header-img"` 的圖像(比如一個 logo)
+1. 在 `#header` 元素中,你可以看到一個 `id="nav-bar"` 的 `nav` 元素
+1. 在 `nav` 元素中,你可以看到至少三個可點擊的元素,每個元素的 class 爲 `nav-link`
+1. 當你點擊 `nav` 內的 `.nav-link` 按鈕時,應滾動到登錄頁相應的部分
+1. 你可以觀看一個 `id="video"` 的嵌入的產品視頻
+1. 你的登錄頁有一個 `id="form"` 的 `form` 元素
+1. 在表單中,應存在一個 `id="email"` 的 `input` 輸入框供用戶填寫郵箱地址
+1. 在 `#email` 輸入框內應有描述該區域用途的佔位符文本
+1. `#email` 輸入框應該用 HTML5 驗證來確認輸入的內容是否爲郵箱地址
+1. 在表單中,有一個 `id="submit"` 的 `input` 提交按鈕
+1. 當你點擊 `#submit` 元素時,郵箱會被提交到一個靜態頁面 (使用這個模擬 URL:`https://www.freecodecamp.com/email-submit`)
+1. 導航欄應該始終位於視口的頂部
+1. 你的產品登陸頁面至少要有一個媒體查詢
+1. 你的產品登陸頁面應該至少使用一次 CSS flexbox
-Fulfill the user stories and pass all the tests below to complete this project. Give it your own personal style. Happy Coding!
+完成需求並通過下面的所有測試來完成這個項目。 賦予它你自己的個人風格。 編程愉快!
# --hints--
-You should have a `header` element with an `id` of `header`
+你應該有一個 `id` 爲 `header` 的 `header` 元素
```js
const el = document.getElementById('header')
assert(!!el && el.tagName === 'HEADER')
```
-You should have an `img` element with an `id` of `header-img`
+你應該有一個 `id` 爲 `header-img` 的 `img` 元素
```js
const el = document.getElementById('header-img')
assert(!!el && el.tagName === 'IMG')
```
-Your `#header-img` should be a descendant of the `#header`
+你的 `#header-img` 元素應該是 `#header` 元素的子元素
```js
const els = document.querySelectorAll('#header #header-img')
assert(els.length > 0)
```
-Your `#header-img` should have a `src` attribute
+你的 `#header-img` 元素應該有一個 `src` 屬性
```js
const el = document.getElementById('header-img')
assert(!!el && !!el.src)
```
-Your `#header-img`’s `src` value should be a valid URL (starts with `http`)
+你的 `#header-img` 元素的 `src` 屬性應該有一個有效的 URL(以 `http` 開頭)
```js
const el = document.getElementById('header-img')
assert(!!el && /^http/.test(el.src))
```
-You should have a `nav` element with an `id` of `nav-bar`
+你應該有一個 `id` 爲 `nav-bar` 的 `nav` 元素
```js
const el = document.getElementById('nav-bar')
assert(!!el && el.tagName === 'NAV')
```
-Your `#nav-bar` should be a descendant of the `#header`
+你的 `#nav-bar` 元素應該是 `#header` 元素的子元素
```js
const els = document.querySelectorAll('#header #nav-bar')
assert(els.length > 0)
```
-You should have at least 3 `.nav-link` elements within the `#nav-bar`
+在 `#nav-bar` 內,你應該有至少三個 `.nav-link` 元素
```js
const els = document.querySelectorAll('#nav-bar .nav-link')
assert(els.length >= 3)
```
-Each `.nav-link` element should have an `href` attribute
+每個 `.nav-link` 元素應該有一個 `href` 元素
```js
const els = document.querySelectorAll('.nav-link')
@@ -98,7 +98,7 @@ els.forEach(el => {
assert(els.length > 0)
```
-Each `.nav-link` element should link to a corresponding element on the landing page (has an `href` with a value of another element's id. e.g. `#footer`)
+每一個 `.nav-link` 元素應該鏈接到登陸頁面上的相應元素(有一個 `href` 具有另一個元素的 id 的值,例如: `#footer`)
```js
const els = document.querySelectorAll('.nav-link')
@@ -109,91 +109,99 @@ els.forEach(el => {
assert(els.length > 0)
```
-You should have a `video` or `iframe` element with an `id` of `video`
+你應該有一個 `id` 爲 `video` 的 `video` 或 `iframe` 元素
```js
const el = document.getElementById('video')
assert(!!el && (el.tagName === 'VIDEO' || el.tagName === 'IFRAME'))
```
-Your `#video` should have a `src` attribute
+你的 `#video` 元素應該有一個 `src` 屬性
```js
-const el = document.getElementById('video')
-assert(!!el && !!el.src)
+let el = document.getElementById('video')
+const sourceNode = el.children;
+let sourceElement = null;
+if (sourceNode.length) {
+ sourceElement = [...video.children].filter(el => el.localName === 'source')[0];
+}
+if (sourceElement) {
+ el = sourceElement;
+}
+assert(el.hasAttribute('src'));
```
-You should have a `form` element with an `id` of `form`
+你應該有一個 `id` 爲 `form` 的 `form` 元素
```js
const el = document.getElementById('form')
assert(!!el && el.tagName === 'FORM')
```
-You should have an `input` element with an `id of `email`
+你應該有一個 `id` 爲 `email` 的 `input` 元素
```js
const el = document.getElementById('email')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#email` should be a descendant of the `#form`
+你的 `#email` 元素應該是 `#form` 元素的子元素
```js
const els = document.querySelectorAll('#form #email')
assert(els.length > 0)
```
-Your `#email` should have the `placeholder` attribute with placeholder text
+你的 `#email` 元素應該有 `placeholder` 屬性與佔位符文本
```js
const el = document.getElementById('email')
assert(!!el && !!el.placeholder && el.placeholder.length > 0)
```
-Your `#email` should use HTML5 validation by setting its `type` to `email`
+你的 `#email` 元素應該使用 HTML5 驗證,方法是設置 `type` 爲 `email`
```js
const el = document.getElementById('email')
assert(!!el && el.type === 'email')
```
-You should have an `input` element with an `id` of `submit`
+你應該有一個 `id` 爲 `submit` 的 `input` 元素
```js
const el = document.getElementById('submit')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#submit` should be a descendant of the `#form`
+你的 `#submit` 元素應該是 `#form` 元素的子元素
```js
const els = document.querySelectorAll('#form #submit')
assert(els.length > 0)
```
-Your `#submit` should have a `type` of `submit`
+你的 `#submit` 元素應該具有 `type` 爲 `submit`
```js
const el = document.getElementById('submit')
assert(!!el && el.type === 'submit')
```
-Your `#form` should have an `action` attribute of `https://www.freecodecamp.com/email-submit`
+你的 `#form` 元素應該有值爲 `https://www.freecodecamp.com/email-submit` 的 `action` 屬性
```js
const el = document.getElementById('form')
assert(!!el && el.action === 'https://www.freecodecamp.com/email-submit')
```
-Your `#email` should have a `name` attribute of `email`
+你的 `#email` 元素應該具有值爲 `email` 的 `name` 屬性
```js
const el = document.getElementById('email')
assert(!!el && el.name === 'email')
```
-Your `#nav-bar` should always be at the top of the viewport
+你的 `#nav-bar` 元素應該始終位於視口的頂部
```js
const el = document.getElementById('nav-bar')
@@ -202,13 +210,15 @@ const top2 = el?.offsetTop
assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
```
-Your Product Landing Page should use at least one media query
+你的產品登陸頁面至少要有一個媒體查詢
```js
-assert.isAtLeast(new __helpers.CSSHelp(document).getCSSRules('media')?.length, 1);
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
```
-Your Product Landing Page should use CSS Flexbox at least once
+你的產品登陸頁面應該至少使用一次 CSS Flexbox
```js
const stylesheet = new __helpers.CSSHelp(document).getStyleSheet()
diff --git a/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md b/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
index 178881da2ab..872e8a4192f 100644
--- a/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
+++ b/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
@@ -222,7 +222,9 @@ assert(!!el && left1 >= -15 && left1 <= 15 && left2 >= -15 && left2 <= 15)
你的技術文檔項目應該使用至少一個媒體查詢。
```js
-assert.isAtLeast(new __helpers.CSSHelp(document).getCSSRules('media')?.length, 1);
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
```
# --seed--
diff --git a/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md b/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
index 231292b4373..4a5b3a5ed48 100644
--- a/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
+++ b/curriculum/challenges/chinese-traditional/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
@@ -1,6 +1,6 @@
---
id: bd7158d8c442eddfaeb5bd18
-title: Build a Tribute Page
+title: 製作一個致敬頁
challengeType: 14
forumTopicId: 301147
dashedName: build-a-tribute-page
@@ -8,32 +8,32 @@ dashedName: build-a-tribute-page
# --description--
-**Objective:** Build an app that is functionally similar to https://tribute-page.freecodecamp.rocks
+**目標:** 構建一個功能類似於 https://tribute-page.freecodecamp.rocks 的應用程序
-**User Stories:**
+**需求:**
-1. Your tribute page should have an element with a corresponding `id="main"`, which contains all other elements
-1. You should see an element with an `id` of `title`, which contains a string (i.e. text), that describes the subject of the tribute page (e.g. "Dr. Norman Borlaug")
-1. You should see either a `figure` or a `div` element with an `id` of `img-div`
-1. Within the `img-div` element, you should see an `img` element with a corresponding `id="image"`
-1. Within the `img-div` element, you should see an element with a corresponding `id="img-caption"` that contains textual content describing the image shown in `img-div`
-1. You should see an element with a corresponding `id="tribute-info"`, which contains textual content describing the subject of the tribute page
-1. You should see an a element with a corresponding `id="tribute-link"`, which links to an outside site, that contains additional information about the subject of the tribute page. HINT: You must give your element an attribute of `target` and set it to `_blank` in order for your link to open in a new tab
-1. Your `#image` should use `max-width` and `height` properties to resize responsively, relative to the width of its parent element, without exceeding its original size
-1. Your `img` element should be centered within its parent element
+1. 你的致敬頁面應該有一個 `id="main"` 的元素,該元素包含所有其他元素
+1. 你應該會看到一個 `id` 爲 `title` 的元素,其中包含一個字符串(即文本),描述了致敬頁面的主題(例如 “Dr. Norman Borlaug”)
+1. 你應該有一個 `id` 爲 `img-div` 的 `figure` 或 `div` 元素
+1. 在 `img-div` 元素中,你應該看到一個 `id="image"` 的 `img` 元素
+1. 在`img-div`元素內,你應該看到一個 `id="img-caption"` 的元素,其中包含對 `img-div` 中圖像的文本描述
+1. 你應該看到一個 `id="tribute-info"` 的元素,其中包含描述致敬頁主題的文本內容
+1. 你應該看到一個 `id="tribute-link"` 的元素,它鏈接到一個包含有關致敬頁主題額外信息的外部網頁。 提示:你必須爲元素提供 `target` 屬性,並設置其爲 `_blank`,以便可以在新選項卡中打開鏈接。
+1. 你的 `#image` 應該使用 `max-width` 和 `height` 屬性來響應式調整大小,相對於其父元素的寬度,但不超過其原始大小
+1. 你的 `img` 元素應該在其父元素內居中
-Fulfill the user stories and pass all the tests below to complete this project. Give it your own personal style. Happy Coding!
+完成需求並通過下面的所有測試來完成這個項目。 賦予它你自己的個人風格。 編程愉快!
# --hints--
-You should have a `main` element with an `id` of `main`
+你的頁面應該包含一個 `main` 元素,且它有一個值爲`main` 的`id`屬性。
```js
const el = document.getElementById('main')
assert(!!el && el.tagName === 'MAIN')
```
-Your `#img-div`, `#image`, `#img-caption`, `#tribute-info`, and `#tribute-link` should all be descendants of `#main`
+你的 `#img-div`、`#image`、`#img-caption`、`#tribute-info` 和 `#tribute-link` 應該是 `#main` 的子元素。
```js
const el1 = document.querySelector('#main #img-div')
@@ -44,14 +44,14 @@ const el5 = document.querySelector('#main #tribute-link')
assert(!!el1 & !!el2 && !!el3 && !!el4 && !!el5)
```
-You should have an element with an `id` of `title`
+你應該有一個 `id` 爲 `title` 的元素。
```js
const el = document.getElementById('title')
assert(!!el)
```
-Your `#title` should not be empty
+你的 `#title` 不應爲空。
```js
const el = document.getElementById('title')
@@ -59,120 +59,116 @@ assert(!!el && el.innerText.length > 0)
```
-You should have a `figure` or `div` element with an `id` of `img-div`
+你應該有一個 `id` 爲 `img-div` 的 `figure` 或 `div` 元素。
```js
const el = document.getElementById('img-div')
assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGURE'))
```
-You should have an `img` element with an `id` of `image`
+你應該有一個 `id` 爲 `image` 的 `img` 元素。
```js
const el = document.getElementById('image')
assert(!!el && el.tagName === 'IMG')
```
-Your `#image` should be a descendant of `#img-div`
+你的 `#image` 元素應該是 `#img-div` 元素的子元素。
```js
const el = document.querySelector('#img-div #image')
assert(!!el)
```
-You should have a `figcaption` or `div` element with an `id` of `img-caption`
+你應該有一個 `id` 爲 `img-caption` 的 `figcaption` 或 `div` 元素。
```js
const el = document.getElementById('img-caption')
assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGCAPTION'))
```
-Your `#img-caption` should be a descendant of `#img-div`
+你的 `#img-caption` 元素應該是 `#img-div` 元素的子元素。
```js
const el = document.querySelector('#img-div #img-caption')
assert(!!el)
```
-Your `#img-caption` should not be empty
+你的 `#img-caption` 不應爲空。
```js
const el = document.getElementById('img-caption')
assert(!!el && el.innerText.length > 0)
```
-You should have an element with an `id` of `tribute-info`
+你應該有一個 `id` 爲 `tribute-info` 的元素。
```js
const el = document.getElementById('tribute-info')
assert(!!el)
```
-Your `#tribute-info` should not be empty
+你的 `#tribute-info` 不應爲空。
```js
const el = document.getElementById('tribute-info')
assert(!!el && el.innerText.length > 0)
```
-You should have an `a` element with an `id` of `tribute-link`
+你應該有一個 `id` 爲 `tribute-link` 的 `a` 元素。
```js
const el = document.getElementById('tribute-link')
assert(!!el && el.tagName === 'A')
```
-Your `#tribute-link` should have an `href` attribute and value
+你的 `#tribute-link` 應該有一個 `href` 屬性和值。
```js
const el = document.getElementById('tribute-link')
assert(!!el && !!el.href && el.href.length > 0)
```
-Your `#tribute-link` should have a `target` attribute set to `_blank`
+你的 `#tribute-link` 元素應該有一個值爲 `_blank` 的 `target` 屬性。
```js
const el = document.getElementById('tribute-link')
assert(!!el && el.target === '_blank')
```
-You should use an `#image` selector in your CSS to style the `#image` and pass the next three tests
+你的 `img` 元素應該具有 `display` 值爲 `block`。
```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')
-assert(!!style)
-```
-
-Your `#image` should have a `display` of `block`
-
-```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('display')
+const img = document.getElementById('image');
+const imgStyle = window.getComputedStyle(img);
+const style = imgStyle?.getPropertyValue('display')
assert(style === 'block')
```
-Your `#image` should have a `max-width` of `100%`
+你的 `#image` 元素應該具有 `max-width` 值爲 `100%`。
```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('max-width')
+const img = document.getElementById('image');
+const imgStyle = window.getComputedStyle(img);
+const style = imgStyle?.getPropertyValue('max-width')
assert(style === '100%')
```
-Your `#image` should have a `height` of `auto`
+你的 `#image` 元素應該具有 `height` 值爲 `auto`。
```js
// taken from the testable-projects repo
const img = document.getElementById('image');
-const maxWidthValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('max-width')
-const displayValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('display')
-const oldDisplayValue = img?.style.getPropertyValue('display');
-const oldDisplayPriority = img?.style.getPropertyPriority('display');
+const imgStyle = window.getComputedStyle(img);
+const oldDisplayValue = imgStyle.getPropertyValue('display');
+const oldDisplayPriority = imgStyle.getPropertyPriority('display');
img?.style.setProperty('display', 'none', 'important');
-const heightValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('height')
+const heightValue = imgStyle?.getPropertyValue('height')
img?.style.setProperty('display', oldDisplayValue, oldDisplayPriority);
assert(heightValue === 'auto')
```
-Your `#image` should be centered within its parent
+你的 `#image` 元素應該在其父元素內居中。
```js
// taken from the testable-projects repo
diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md
index 76164cd1b6b..2847754f9fb 100644
--- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md
+++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md
@@ -8,7 +8,7 @@ dashedName: create-complex-multi-dimensional-arrays
# --description--
-很好! 你現在已經學到很多關於數組的知識了, 但這些只是個開始。我們將在接下來的中挑戰中學到更多與數組相關的知識。 在繼續學習對象(Objects)之前,讓我們再花一點時間瞭解下更復雜的數組嵌套。
+很好! 你現在已經學到很多關於數組的知識了, 但這些只是個開始。我們將在接下來的中挑戰中學到更多與數組相關的知識。 但在繼續查看 對象 之前,讓我們再看一下,看看數組如何變得比我們在之前的挑戰中看到的更復雜一些。
數組的一個強大的特性是,它可以包含其他數組,甚至完全由其他數組組成。 在上一個挑戰中,我們已經接觸到了包含數組的數組,但它還算是比較簡單的。 數組中的數組還可以再包含其他數組,即可以嵌套任意多層數組。 通過這種方式,數組可以很快成爲非常複雜的數據結構,稱爲多維(multi-dimensional)數組,或嵌套(nested)數組。 請看如下的示例:
diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
index 3210dfa7c1b..c335ff3ef23 100644
--- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
+++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
@@ -17,19 +17,19 @@ dashedName: understanding-uninitialized-variables
# --hints--
-`a` 應該被定義,並且值爲 `6`。
+應該定義變量 `a`,且它的值爲 `6`。
```js
assert(typeof a === 'number' && a === 6);
```
-`b` 應該被定義,並且值爲 `15`。
+應該定義變量 `b`,且它最終的值爲 `15`。
```js
assert(typeof b === 'number' && b === 15);
```
-`c` 的值不能包含 `undefined`,應該爲字符串 `I am a String!`。
+變量 `c` 的值不能包含 `undefined`,應該爲字符串 `I am a String!`。
```js
assert(!/undefined/.test(c) && c === 'I am a String!');
diff --git a/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md b/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md
new file mode 100644
index 00000000000..feed089188c
--- /dev/null
+++ b/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md
@@ -0,0 +1,279 @@
+---
+id: bd7158d8c242eddfaeb5bd13
+title: 製作一個個人作品集展示頁
+challengeType: 14
+forumTopicId: 301143
+dashedName: build-a-personal-portfolio-webpage
+---
+
+# --description--
+
+**目標:** 構建一個功能類似於 https://personal-portfolio.freecodecamp.rocks 的應用程序
+
+**需求:**
+
+1. 你的作品集應該有一個 `id` 爲 `welcome-section` 的歡迎部分
+1. 歡迎部分應該有一個包含文本的 `h1` 元素
+1. 你的作品集應該有一個 `id` 爲 `projects` 的項目部分
+1. 項目部分應該包含至少一個 `class` 爲 `project-tile` 的元素來保存項目
+1. 項目部分應該包含至少一個項目的鏈接
+1. 你的作品集應該有一個 id 爲 `navbar` 的導航欄
+1. 導航欄應該至少包含一個鏈接,你可以點擊它來導航到頁面的不同部分
+1. 你的作品集應該有一個 id 爲 `profile-link` 的鏈接,在新標籤中打開你的 GitHub 或 freeCodeCodeCamp 個人主頁
+1. 你的作品集應該至少有一個媒體查詢
+1. 歡迎部分的高度應該等於視口的高度
+1. 導航欄應該始終位於視口的頂部
+
+完成需求並通過下面的所有測試來完成這個項目。 賦予它你自己的個人風格。 編程愉快!
+
+# --hints--
+
+你的作品集應該有一個 `id` 爲 `welcome-section` 的歡迎部分。
+
+```js
+const el = document.getElementById('welcome-section')
+assert(!!el);
+```
+
+你的 `#welcome-section` 元素應該包含一個 `h1` 元素。
+
+```js
+assert.isAbove(
+ document.querySelectorAll('#welcome-section h1').length,
+ 0,
+ 'Welcome section should contain an h1 element '
+);
+```
+
+在 `#welcome-section` 元素中,你不應該有任何空的 `h1` 元素。
+
+```js
+assert.isAbove(
+ document.querySelectorAll('#welcome-section h1')?.[0]?.innerText?.length,
+ 0,
+ 'h1 element in welcome section should contain your name or camper ' +
+ 'name '
+);
+```
+
+你應該有一個 `id` 爲 `projects` 的項目部分。
+
+```js
+const el = document.getElementById('projects')
+assert(!!el);
+```
+
+你的作品集應該包含至少一個 class 爲 `project-tile` 的元素。
+
+```js
+assert.isAbove(
+ document.querySelectorAll('#projects .project-tile').length,
+ 0
+);
+```
+
+你的 `#projects` 元素應該包含至少一個 `a` 元素。
+
+```js
+assert.isAbove(document.querySelectorAll('#projects a').length, 0);
+```
+
+你的作品集應該有一個 `id` 爲 `navbar` 的導航欄。
+
+```js
+const el = document.getElementById('navbar');
+assert(!!el);
+```
+
+你的 `#navbar` 元素應該包含至少一個 `a` 元素,它的 `href` 屬性以 `#` 開頭。
+
+```js
+const links = [...document.querySelectorAll('#navbar a')].filter(
+ (nav) => (nav?.getAttribute('href') || '').substr(0, 1) === '#'
+);
+
+assert.isAbove(
+ links.length,
+ 0,
+ 'Navbar should contain an anchor link '
+);
+```
+
+你的作品集應該有一個 `id` 爲 `profile-link` 的 `a` 元素。
+
+```js
+const el = document.getElementById('profile-link');
+assert(!!el && el.tagName === 'A')
+```
+
+你的 `#profile-link` 元素應該有一個值爲 `_blank` 的 `target` 屬性。
+
+```js
+const el = document.getElementById('profile-link');
+assert(!!el && el.target === '_blank')
+```
+
+你的作品集應該至少有一個媒體查詢。
+
+```js
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
+```
+
+你的 `#navbar` 元素應該始終位於視口的頂部。
+
+```js
+(async () => {
+ const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
+
+ const navbar = document.getElementById('navbar');
+ assert.approximately(
+ navbar?.getBoundingClientRect().top,
+ 0,
+ 15,
+ "Navbar's parent should be body and it should be at the top of " +
+ 'the viewport '
+ );
+
+ window.scroll(0, 500);
+
+ await timeout(1);
+
+ assert.approximately(
+ navbar?.getBoundingClientRect().top,
+ 0,
+ 15,
+ 'Navbar should be at the top of the viewport even after ' +
+ 'scrolling '
+ );
+ window.scroll(0, 0);
+})();
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+```
+
+```css
+
+```
+
+## --solutions--
+
+```html
+
+
+
+ Welcome to a basic introduction of algebra. In this tutorial, we will
+ review some of the more common algebraic concepts.
+
+
+
+ Definitions
+
+ To start with, let's define some of the more common terms used in
+ algebra:
+
+
+
+ Variable: A variable is an unknown value, usually represented
+ by a letter.
+
+
+ Expression: Essentially a mathematical object. For the
+ purpose of this tutorial, an expression is one part of an equation.
+
+
+ Equation: An equation is a mathematical argument in which two
+ expressions result in the same value.
+
+
+
+
+ Examples
+
+ Sometimes it is easier to understand the definitions when you have a
+ physical example to look at. Here is an example of the above terms.
+ x + 5 = 12
+ In this above example, we have:
+
+
+
Variable: The variable in the example is "x".
+
+ Expression: There are two expressions in this example. They
+ are "x+5" and "12".
+
+
+ Equation: The entire example, "x+5=12", is an equation.
+
+
+
+
+ Solving Equations
+
+ The primary use for algebra is to determine an unknown value, the
+ "variable", with the information provided. Continuing to use our
+ example from above, we can find the value of the variable "x".
+ x + 5 = 12
+ In an equation, both sides result in the same value. So you can
+ manipulate the two expressions however you need, as long as you
+ perform the same operation (or change) to each side. You do this
+ because the goal when solving an equation is to
+ get the variable into its own expression, or by itself on one side
+ of the = sign. For this example, we want to remove the "+5" so the "x" is
+ alone. To do this, we can subtract 5, because subtraction is
+ the opposite operation to addition. But remember, we have to perform
+ the same operation to both sides of the equation. Now our equation
+ looks like this.
+ x + 5 - 5 = 12 - 5
+ The equation looks like a mess right now, because we haven't completed
+ the operations. We can simplify this equation to make it easier
+ to read by performing the operations "5-5" and "12-5". The result
+ is:
+ x = 7
+ We now have our solution to this equation!
+
+
+
+ Solving Equations II
+
+ Let us look at a slightly more challenging equation.
+ 3x + 4 = 13
+ Again we can start with subtraction. In this case, we want to subtract
+ 4 from each side of the equation. We will also go ahead and simplify
+ with each step. So now we have:
+ 3x = 9
+ "3x" translates to "3*x", where the "*" symbol indicates
+ multiplication. We use the "*" to avoid confusion, as the "x" is now a
+ variable instead of a multiplication symbol. The opposite operation
+ for multiplication is division, so we need to
+ divide each expression by 3.
+ x = 3
+ And now we have our solution!
+
+
+
+ Solving Equations III
+
+ Now we are getting in to more complex operations. Here is another
+ equation for us to look at:
+ x^2 - 8 = 8
+ Our very first step will be to add 8 to each side. This is
+ different from our previous examples, where we had to subtract. But
+ remember, our goal is to get the variable alone by performing opposite
+ operations.
+ x^2 = 16
+ But what does the "^2" mean? The "^" symbol is used to denote
+ exponents in situations where superscript is not available. When
+ superscript is available, you would see it as x2.
+ For the sake of this project, however, we will use the "^" symbol.
+ An exponent tells you how many times the base (in our case, "x") is
+ multiplied by itself. So, "x^2" would be the same as "x*x". Now the
+ opposite function of multiplication is division, but we would have to
+ divide both sides by "x". We do not want to do this, as that
+ would put an "x" on the other side of the equation. So instead, we
+ need to use the root operation! For an exponent of "2", we call this
+ the "square root" and denote it with "√". Our equation is now:
+
+ x = √9
+ Performing a root operation by hand can be a tedious process, so we
+ recommend using a calculator when necessary. However, we are lucky in
+ that "9" is a
+ perfect square, so we do not need to calculate anything. Instead, we find our
+ answer to be:
+ x = 3
+
+
+
+ System of Equations
+
+ As you explore your algebra studies further, you may start to run
+ across equations with more than one variable. The first such equations
+ will likely look like:
+ y = 3x
+ An equation like this does not have one single solution.
+ Rather, there are a series of values for which the equation is true.
+ For example, if "x=3" and "y=9", the equation is true. These equations
+ are usually used to plot a graph.
+ Getting more complicated, though, you may be given a pair of
+ equations. This is called a "system of equations", and CAN be solved.
+ Let's look at how we do this! Consider the following system of
+ equations:
+ y = 3x | y - 6 = x
+ A system of equations IS solvable, but it is a multi-step process. To
+ get started, we need to chose a variable we are solving for. Let's
+ solve for "x" first. From the second equation, we know that "x" equals
+ "y - 6", but we cannot simplify that further because we do not have a
+ value for "y". Except, thanks to the system of equations, we DO have a
+ value for "y". We know that "y" equals "3x". So, looking at our second
+ equation, we can replace "y" with "3x" because they have the same
+ value. We then get:
+ 3x - 6 = x
+ Now we can solve for "x"! We start by adding 6 to each side.
+ 3x = x + 6
+ We still need to get "x" by itself, so we subtract "x" from both sides
+ and get:
+ 2x = 6
+ If this confuses you, remember that "3x" is the same as "x+x+x".
+ Subtract an "x" from that and you get "x+x", or "2x". Now we divide
+ both sides by 2 and have our value for x!
+ x = 3
+ However, our work is not done yet. We still need to find the value for
+ "y". Let's go back to our first equation:
+ y = 3x
+ We have a value for "x" now, so let's see what happens if we put that
+ value in.
+ y = 3*3
+ We perform the multiplication and discover that "y=9"! Our solution to
+ this system of equations then is:
+ x = 3 and y = 9
+
+
+
+ Try it Yourself!
+
Coming Soon!
+
Keep an eye out for new additions!
+
+
+ More Information
+
Check out the following links for more information!
+
+
+ Wolfram Alpha
+ is a great source for multiple mathematic fields.
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ background: #f5f6f7;
+ color: #1b1b32;
+ font-family: Helvetica;
+ margin: 0;
+}
+
+header {
+ width: 100%;
+ height: 50px;
+ background-color: #1b1b32;
+ display: flex;
+}
+
+#logo {
+ width: max(100px, 18vw);
+ background-color: #0a0a23;
+ aspect-ratio: 35 / 4;
+ padding: 0.4rem;
+}
+
+h1 {
+ color: #f1be32;
+ font-size: min(5vw, 1.2em);
+}
+
+nav {
+ width: 50%;
+ max-width: 300px;
+ height: 50px;
+}
+
+nav > ul {
+ display: flex;
+ justify-content: space-evenly;
+}
+```
diff --git a/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/614ccc21ea91ef1736b9b578.md b/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/614ccc21ea91ef1736b9b578.md
new file mode 100644
index 00000000000..87ace3bfa33
--- /dev/null
+++ b/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/614ccc21ea91ef1736b9b578.md
@@ -0,0 +1,50 @@
+---
+id: 614ccc21ea91ef1736b9b578
+title: 步驟 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+歡迎來到無障礙測試題的第一部分。 你正在成爲一個經驗豐富的 HTML 和 CSS 開發者,我們從基本的模板帶你開始學習這些知識。
+
+通過爲你的 `html` 元素添加一個 `lang` 屬性來開始這段無障礙之旅。 這將幫助屏幕閱讀器識別頁面的語言。
+
+# --hints--
+
+你應該給 `html` 元素一個 `lang` 屬性。 _提示:對於英文,你可以使用值 `en` 。_
+
+```js
+assert.match(code, //i);
+// TODO: This should/could be fixed in the builder.js
+// assert.notThrow(Intl.getCanonicalLocales(document.querySelector('html').lang));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ background: #f5f6f7;
+ color: #1b1b32;
+ font-family: Helvetica;
+ margin: 0;
+}
+```
diff --git a/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md b/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md
new file mode 100644
index 00000000000..1d10716225a
--- /dev/null
+++ b/curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md
@@ -0,0 +1,43 @@
+---
+id: 5f33071498eb2472b87ddee4
+title: 第1步:
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+之前在Cat Photo App的最後幾個步驟中提過,構建網頁前需要一個基本的結構。
+
+添加標籤 `` 和元素 `html` 。
+
+# --hints--
+
+需要先聲明`DOCTYPE`
+
+```js
+assert(code.match(//i));
+```
+
+需要一個起始標籤 ``
+
+```js
+assert(code.match(//i));
+```
+
+需要一個閉合標籤 `` 別忘了閉合標籤的尖括號 `<` 後需要有一個 `/`
+
+```js
+assert(code.match(/<\/html>/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
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 cdd62359751..9306b781337 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
@@ -1,6 +1,6 @@
---
id: 587d78af367417b2b2512b04
-title: Build a Product Landing Page
+title: 制作一个产品登录页
challengeType: 14
forumTopicId: 301144
dashedName: build-a-product-landing-page
@@ -8,87 +8,87 @@ dashedName: build-a-product-landing-page
# --description--
-**Objective:** Build an app that is functionally similar to https://product-landing-page.freecodecamp.rocks
+**目标:** 构建一个功能类似于 https://product-landing-page.freecodecamp.rocks 的应用程序
-**User Stories:**
+**需求:**
-1. Your product landing page should have a `header` element with a corresponding `id="header"`
-1. You can see an image within the `header` element with a corresponding `id="header-img"` (A logo would make a good image here)
-1. Within the `#header` element, you can see a `nav` element with a corresponding `id="nav-bar"`
-1. You can see at least three clickable elements inside the `nav` element, each with the class `nav-link`
-1. When you click a `.nav-link` button in the `nav` element, you are taken to the corresponding section of the landing page
-1. You can watch an embedded product video with `id="video"`
-1. Your landing page has a `form` element with a corresponding `id="form"`
-1. Within the form, there is an `input` field with `id="email"` where you can enter an email address
-1. The `#email` input field should have placeholder text to let users know what the field is for
-1. The `#email` input field uses HTML5 validation to confirm that the entered text is an email address
-1. Within the form, there is a submit `input` with a corresponding `id="submit"`
-1. When you click the `#submit` element, the email is submitted to a static page (use this mock URL: `https://www.freecodecamp.com/email-submit`)
-1. The navbar should always be at the top of the viewport
-1. Your product landing page should have at least one media query
-1. Your product landing page should utilize CSS flexbox at least once
+1. 你的产品登录页应该有一个 `id="header"` 的 `header` 元素
+1. 你可以在 `header` 元素中看到一个 `id="header-img"` 的图像(比如一个 logo)
+1. 在 `#header` 元素中,你可以看到一个 `id="nav-bar"` 的 `nav` 元素
+1. 在 `nav` 元素中,你可以看到至少三个可点击的元素,每个元素的 class 为 `nav-link`
+1. 当你点击 `nav` 内的 `.nav-link` 按钮时,应滚动到登录页相应的部分
+1. 你可以观看一个 `id="video"` 的嵌入的产品视频
+1. 你的登录页有一个 `id="form"` 的 `form` 元素
+1. 在表单中,应存在一个 `id="email"` 的 `input` 输入框供用户填写邮箱地址
+1. 在 `#email` 输入框内应有描述该区域用途的占位符文本
+1. `#email` 输入框应该用 HTML5 验证来确认输入的内容是否为邮箱地址
+1. 在表单中,有一个 `id="submit"` 的 `input` 提交按钮
+1. 当你点击 `#submit` 元素时,邮箱会被提交到一个静态页面 (使用这个模拟 URL:`https://www.freecodecamp.com/email-submit`)
+1. 导航栏应该始终位于视口的顶部
+1. 你的产品登陆页面至少要有一个媒体查询
+1. 你的产品登陆页面应该至少使用一次 CSS flexbox
-Fulfill the user stories and pass all the tests below to complete this project. Give it your own personal style. Happy Coding!
+完成需求并通过下面的所有测试来完成这个项目。 赋予它你自己的个人风格。 编程愉快!
# --hints--
-You should have a `header` element with an `id` of `header`
+你应该有一个 `id` 为 `header` 的 `header` 元素
```js
const el = document.getElementById('header')
assert(!!el && el.tagName === 'HEADER')
```
-You should have an `img` element with an `id` of `header-img`
+你应该有一个 `id` 为 `header-img` 的 `img` 元素
```js
const el = document.getElementById('header-img')
assert(!!el && el.tagName === 'IMG')
```
-Your `#header-img` should be a descendant of the `#header`
+你的 `#header-img` 元素应该是 `#header` 元素的子元素
```js
const els = document.querySelectorAll('#header #header-img')
assert(els.length > 0)
```
-Your `#header-img` should have a `src` attribute
+你的 `#header-img` 元素应该有一个 `src` 属性
```js
const el = document.getElementById('header-img')
assert(!!el && !!el.src)
```
-Your `#header-img`’s `src` value should be a valid URL (starts with `http`)
+你的 `#header-img` 元素的 `src` 属性应该有一个有效的 URL(以 `http` 开头)
```js
const el = document.getElementById('header-img')
assert(!!el && /^http/.test(el.src))
```
-You should have a `nav` element with an `id` of `nav-bar`
+你应该有一个 `id` 为 `nav-bar` 的 `nav` 元素
```js
const el = document.getElementById('nav-bar')
assert(!!el && el.tagName === 'NAV')
```
-Your `#nav-bar` should be a descendant of the `#header`
+你的 `#nav-bar` 元素应该是 `#header` 元素的子元素
```js
const els = document.querySelectorAll('#header #nav-bar')
assert(els.length > 0)
```
-You should have at least 3 `.nav-link` elements within the `#nav-bar`
+在 `#nav-bar` 内,你应该有至少三个 `.nav-link` 元素
```js
const els = document.querySelectorAll('#nav-bar .nav-link')
assert(els.length >= 3)
```
-Each `.nav-link` element should have an `href` attribute
+每个 `.nav-link` 元素应该有一个 `href` 元素
```js
const els = document.querySelectorAll('.nav-link')
@@ -98,7 +98,7 @@ els.forEach(el => {
assert(els.length > 0)
```
-Each `.nav-link` element should link to a corresponding element on the landing page (has an `href` with a value of another element's id. e.g. `#footer`)
+每一个 `.nav-link` 元素应该链接到登陆页面上的相应元素(有一个 `href` 具有另一个元素的 id 的值,例如: `#footer`)
```js
const els = document.querySelectorAll('.nav-link')
@@ -109,91 +109,99 @@ els.forEach(el => {
assert(els.length > 0)
```
-You should have a `video` or `iframe` element with an `id` of `video`
+你应该有一个 `id` 为 `video` 的 `video` 或 `iframe` 元素
```js
const el = document.getElementById('video')
assert(!!el && (el.tagName === 'VIDEO' || el.tagName === 'IFRAME'))
```
-Your `#video` should have a `src` attribute
+你的 `#video` 元素应该有一个 `src` 属性
```js
-const el = document.getElementById('video')
-assert(!!el && !!el.src)
+let el = document.getElementById('video')
+const sourceNode = el.children;
+let sourceElement = null;
+if (sourceNode.length) {
+ sourceElement = [...video.children].filter(el => el.localName === 'source')[0];
+}
+if (sourceElement) {
+ el = sourceElement;
+}
+assert(el.hasAttribute('src'));
```
-You should have a `form` element with an `id` of `form`
+你应该有一个 `id` 为 `form` 的 `form` 元素
```js
const el = document.getElementById('form')
assert(!!el && el.tagName === 'FORM')
```
-You should have an `input` element with an `id of `email`
+你应该有一个 `id` 为 `email` 的 `input` 元素
```js
const el = document.getElementById('email')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#email` should be a descendant of the `#form`
+你的 `#email` 元素应该是 `#form` 元素的子元素
```js
const els = document.querySelectorAll('#form #email')
assert(els.length > 0)
```
-Your `#email` should have the `placeholder` attribute with placeholder text
+你的 `#email` 元素应该有 `placeholder` 属性与占位符文本
```js
const el = document.getElementById('email')
assert(!!el && !!el.placeholder && el.placeholder.length > 0)
```
-Your `#email` should use HTML5 validation by setting its `type` to `email`
+你的 `#email` 元素应该使用 HTML5 验证,方法是设置 `type` 为 `email`
```js
const el = document.getElementById('email')
assert(!!el && el.type === 'email')
```
-You should have an `input` element with an `id` of `submit`
+你应该有一个 `id` 为 `submit` 的 `input` 元素
```js
const el = document.getElementById('submit')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#submit` should be a descendant of the `#form`
+你的 `#submit` 元素应该是 `#form` 元素的子元素
```js
const els = document.querySelectorAll('#form #submit')
assert(els.length > 0)
```
-Your `#submit` should have a `type` of `submit`
+你的 `#submit` 元素应该具有 `type` 为 `submit`
```js
const el = document.getElementById('submit')
assert(!!el && el.type === 'submit')
```
-Your `#form` should have an `action` attribute of `https://www.freecodecamp.com/email-submit`
+你的 `#form` 元素应该有值为 `https://www.freecodecamp.com/email-submit` 的 `action` 属性
```js
const el = document.getElementById('form')
assert(!!el && el.action === 'https://www.freecodecamp.com/email-submit')
```
-Your `#email` should have a `name` attribute of `email`
+你的 `#email` 元素应该具有值为 `email` 的 `name` 属性
```js
const el = document.getElementById('email')
assert(!!el && el.name === 'email')
```
-Your `#nav-bar` should always be at the top of the viewport
+你的 `#nav-bar` 元素应该始终位于视口的顶部
```js
const el = document.getElementById('nav-bar')
@@ -202,13 +210,15 @@ const top2 = el?.offsetTop
assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
```
-Your Product Landing Page should use at least one media query
+你的产品登陆页面至少要有一个媒体查询
```js
-assert.isAtLeast(new __helpers.CSSHelp(document).getCSSRules('media')?.length, 1);
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
```
-Your Product Landing Page should use CSS Flexbox at least once
+你的产品登陆页面应该至少使用一次 CSS Flexbox
```js
const stylesheet = new __helpers.CSSHelp(document).getStyleSheet()
diff --git a/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md b/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
index 4d4b34d8539..0e6e446f24a 100644
--- a/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
+++ b/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
@@ -222,7 +222,9 @@ assert(!!el && left1 >= -15 && left1 <= 15 && left2 >= -15 && left2 <= 15)
你的技术文档项目应该使用至少一个媒体查询。
```js
-assert.isAtLeast(new __helpers.CSSHelp(document).getCSSRules('media')?.length, 1);
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
```
# --seed--
diff --git a/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md b/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
index 231292b4373..a37544560b8 100644
--- a/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
+++ b/curriculum/challenges/chinese/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
@@ -1,6 +1,6 @@
---
id: bd7158d8c442eddfaeb5bd18
-title: Build a Tribute Page
+title: 制作一个致敬页
challengeType: 14
forumTopicId: 301147
dashedName: build-a-tribute-page
@@ -8,32 +8,32 @@ dashedName: build-a-tribute-page
# --description--
-**Objective:** Build an app that is functionally similar to https://tribute-page.freecodecamp.rocks
+**目标:** 构建一个功能类似于 https://tribute-page.freecodecamp.rocks 的应用程序
-**User Stories:**
+**需求:**
-1. Your tribute page should have an element with a corresponding `id="main"`, which contains all other elements
-1. You should see an element with an `id` of `title`, which contains a string (i.e. text), that describes the subject of the tribute page (e.g. "Dr. Norman Borlaug")
-1. You should see either a `figure` or a `div` element with an `id` of `img-div`
-1. Within the `img-div` element, you should see an `img` element with a corresponding `id="image"`
-1. Within the `img-div` element, you should see an element with a corresponding `id="img-caption"` that contains textual content describing the image shown in `img-div`
-1. You should see an element with a corresponding `id="tribute-info"`, which contains textual content describing the subject of the tribute page
-1. You should see an a element with a corresponding `id="tribute-link"`, which links to an outside site, that contains additional information about the subject of the tribute page. HINT: You must give your element an attribute of `target` and set it to `_blank` in order for your link to open in a new tab
-1. Your `#image` should use `max-width` and `height` properties to resize responsively, relative to the width of its parent element, without exceeding its original size
-1. Your `img` element should be centered within its parent element
+1. 你的致敬页面应该有一个 `id="main"` 的元素,该元素包含所有其他元素
+1. 你应该会看到一个 `id` 为 `title` 的元素,其中包含一个字符串(即文本),描述了致敬页面的主题(例如 “Dr. Norman Borlaug”)
+1. 你应该有一个 `id` 为 `img-div` 的 `figure` 或 `div` 元素
+1. 在 `img-div` 元素中,你应该看到一个 `id="image"` 的 `img` 元素
+1. 在`img-div`元素内,你应该看到一个 `id="img-caption"` 的元素,其中包含对 `img-div` 中图像的文本描述
+1. 你应该看到一个 `id="tribute-info"` 的元素,其中包含描述致敬页主题的文本内容
+1. 你应该看到一个 `id="tribute-link"` 的元素,它链接到一个包含有关致敬页主题额外信息的外部网页。 提示:你必须为元素提供 `target` 属性,并设置其为 `_blank`,以便可以在新选项卡中打开链接。
+1. 你的 `#image` 应该使用 `max-width` 和 `height` 属性来响应式调整大小,相对于其父元素的宽度,但不超过其原始大小
+1. 你的 `img` 元素应该在其父元素内居中
-Fulfill the user stories and pass all the tests below to complete this project. Give it your own personal style. Happy Coding!
+完成需求并通过下面的所有测试来完成这个项目。 赋予它你自己的个人风格。 编程愉快!
# --hints--
-You should have a `main` element with an `id` of `main`
+你的页面应该包含一个 `main` 元素,且它有一个值为`main` 的`id`属性。
```js
const el = document.getElementById('main')
assert(!!el && el.tagName === 'MAIN')
```
-Your `#img-div`, `#image`, `#img-caption`, `#tribute-info`, and `#tribute-link` should all be descendants of `#main`
+你的 `#img-div`、`#image`、`#img-caption`、`#tribute-info` 和 `#tribute-link` 应该是 `#main` 的子元素。
```js
const el1 = document.querySelector('#main #img-div')
@@ -44,14 +44,14 @@ const el5 = document.querySelector('#main #tribute-link')
assert(!!el1 & !!el2 && !!el3 && !!el4 && !!el5)
```
-You should have an element with an `id` of `title`
+你应该有一个 `id` 为 `title` 的元素。
```js
const el = document.getElementById('title')
assert(!!el)
```
-Your `#title` should not be empty
+你的 `#title` 不应为空。
```js
const el = document.getElementById('title')
@@ -59,120 +59,116 @@ assert(!!el && el.innerText.length > 0)
```
-You should have a `figure` or `div` element with an `id` of `img-div`
+你应该有一个 `id` 为 `img-div` 的 `figure` 或 `div` 元素。
```js
const el = document.getElementById('img-div')
assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGURE'))
```
-You should have an `img` element with an `id` of `image`
+你应该有一个 `id` 为 `image` 的 `img` 元素。
```js
const el = document.getElementById('image')
assert(!!el && el.tagName === 'IMG')
```
-Your `#image` should be a descendant of `#img-div`
+你的 `#image` 元素应该是 `#img-div` 元素的子元素。
```js
const el = document.querySelector('#img-div #image')
assert(!!el)
```
-You should have a `figcaption` or `div` element with an `id` of `img-caption`
+你应该有一个 `id` 为 `img-caption` 的 `figcaption` 或 `div` 元素。
```js
const el = document.getElementById('img-caption')
assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGCAPTION'))
```
-Your `#img-caption` should be a descendant of `#img-div`
+你的 `#img-caption` 元素应该是 `#img-div` 元素的子元素。
```js
const el = document.querySelector('#img-div #img-caption')
assert(!!el)
```
-Your `#img-caption` should not be empty
+你的 `#img-caption` 不应为空。
```js
const el = document.getElementById('img-caption')
assert(!!el && el.innerText.length > 0)
```
-You should have an element with an `id` of `tribute-info`
+你应该有一个 `id` 为 `tribute-info` 的元素。
```js
const el = document.getElementById('tribute-info')
assert(!!el)
```
-Your `#tribute-info` should not be empty
+你的 `#tribute-info` 不应为空。
```js
const el = document.getElementById('tribute-info')
assert(!!el && el.innerText.length > 0)
```
-You should have an `a` element with an `id` of `tribute-link`
+你应该有一个 `id` 为 `tribute-link` 的 `a` 元素。
```js
const el = document.getElementById('tribute-link')
assert(!!el && el.tagName === 'A')
```
-Your `#tribute-link` should have an `href` attribute and value
+你的 `#tribute-link` 应该有一个 `href` 属性和值。
```js
const el = document.getElementById('tribute-link')
assert(!!el && !!el.href && el.href.length > 0)
```
-Your `#tribute-link` should have a `target` attribute set to `_blank`
+你的 `#tribute-link` 元素应该有一个值为 `_blank` 的 `target` 属性。
```js
const el = document.getElementById('tribute-link')
assert(!!el && el.target === '_blank')
```
-You should use an `#image` selector in your CSS to style the `#image` and pass the next three tests
+你的 `img` 元素应该具有 `display` 值为 `block`。
```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')
-assert(!!style)
-```
-
-Your `#image` should have a `display` of `block`
-
-```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('display')
+const img = document.getElementById('image');
+const imgStyle = window.getComputedStyle(img);
+const style = imgStyle?.getPropertyValue('display')
assert(style === 'block')
```
-Your `#image` should have a `max-width` of `100%`
+你的 `#image` 元素应该具有 `max-width` 值为 `100%`。
```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('max-width')
+const img = document.getElementById('image');
+const imgStyle = window.getComputedStyle(img);
+const style = imgStyle?.getPropertyValue('max-width')
assert(style === '100%')
```
-Your `#image` should have a `height` of `auto`
+你的 `#image` 元素应该具有 `height` 值为 `auto`。
```js
// taken from the testable-projects repo
const img = document.getElementById('image');
-const maxWidthValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('max-width')
-const displayValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('display')
-const oldDisplayValue = img?.style.getPropertyValue('display');
-const oldDisplayPriority = img?.style.getPropertyPriority('display');
+const imgStyle = window.getComputedStyle(img);
+const oldDisplayValue = imgStyle.getPropertyValue('display');
+const oldDisplayPriority = imgStyle.getPropertyPriority('display');
img?.style.setProperty('display', 'none', 'important');
-const heightValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('height')
+const heightValue = imgStyle?.getPropertyValue('height')
img?.style.setProperty('display', oldDisplayValue, oldDisplayPriority);
assert(heightValue === 'auto')
```
-Your `#image` should be centered within its parent
+你的 `#image` 元素应该在其父元素内居中。
```js
// taken from the testable-projects repo
diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md
index b5f351a60f1..860814c719d 100644
--- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md
+++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md
@@ -8,7 +8,7 @@ dashedName: create-complex-multi-dimensional-arrays
# --description--
-很好! 你现在已经学到很多关于数组的知识了, 但这些只是个开始。我们将在接下来的中挑战中学到更多与数组相关的知识。 在继续学习对象(Objects)之前,让我们再花一点时间了解下更复杂的数组嵌套。
+很好! 你现在已经学到很多关于数组的知识了, 但这些只是个开始。我们将在接下来的中挑战中学到更多与数组相关的知识。 但在继续查看 对象 之前,让我们再看一下,看看数组如何变得比我们在之前的挑战中看到的更复杂一些。
数组的一个强大的特性是,它可以包含其他数组,甚至完全由其他数组组成。 在上一个挑战中,我们已经接触到了包含数组的数组,但它还算是比较简单的。 数组中的数组还可以再包含其他数组,即可以嵌套任意多层数组。 通过这种方式,数组可以很快成为非常复杂的数据结构,称为多维(multi-dimensional)数组,或嵌套(nested)数组。 请看如下的示例:
diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
index d48cd193ec4..02a04432700 100644
--- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
+++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
@@ -17,19 +17,19 @@ dashedName: understanding-uninitialized-variables
# --hints--
-`a` 应该被定义,并且值为 `6`。
+应该定义变量 `a`,且它的值为 `6`。
```js
assert(typeof a === 'number' && a === 6);
```
-`b` 应该被定义,并且值为 `15`。
+应该定义变量 `b`,且它最终的值为 `15`。
```js
assert(typeof b === 'number' && b === 15);
```
-`c` 的值不能包含 `undefined`,应该为字符串 `I am a String!`。
+变量 `c` 的值不能包含 `undefined`,应该为字符串 `I am a String!`。
```js
assert(!/undefined/.test(c) && c === 'I am a String!');
diff --git a/curriculum/challenges/chinese/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md b/curriculum/challenges/chinese/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md
new file mode 100644
index 00000000000..822f83d2409
--- /dev/null
+++ b/curriculum/challenges/chinese/14-responsive-web-design-22/build-a-personal-portfolio-webpage-project/build-a-personal-portfolio-webpage.md
@@ -0,0 +1,279 @@
+---
+id: bd7158d8c242eddfaeb5bd13
+title: 制作一个个人作品集展示页
+challengeType: 14
+forumTopicId: 301143
+dashedName: build-a-personal-portfolio-webpage
+---
+
+# --description--
+
+**目标:** 构建一个功能类似于 https://personal-portfolio.freecodecamp.rocks 的应用程序
+
+**需求:**
+
+1. 你的作品集应该有一个 `id` 为 `welcome-section` 的欢迎部分
+1. 欢迎部分应该有一个包含文本的 `h1` 元素
+1. 你的作品集应该有一个 `id` 为 `projects` 的项目部分
+1. 项目部分应该包含至少一个 `class` 为 `project-tile` 的元素来保存项目
+1. 项目部分应该包含至少一个项目的链接
+1. 你的作品集应该有一个 id 为 `navbar` 的导航栏
+1. 导航栏应该至少包含一个链接,你可以点击它来导航到页面的不同部分
+1. 你的作品集应该有一个 id 为 `profile-link` 的链接,在新标签中打开你的 GitHub 或 freeCodeCodeCamp 个人主页
+1. 你的作品集应该至少有一个媒体查询
+1. 欢迎部分的高度应该等于视口的高度
+1. 导航栏应该始终位于视口的顶部
+
+完成需求并通过下面的所有测试来完成这个项目。 赋予它你自己的个人风格。 编程愉快!
+
+# --hints--
+
+你的作品集应该有一个 `id` 为 `welcome-section` 的欢迎部分。
+
+```js
+const el = document.getElementById('welcome-section')
+assert(!!el);
+```
+
+你的 `#welcome-section` 元素应该包含一个 `h1` 元素。
+
+```js
+assert.isAbove(
+ document.querySelectorAll('#welcome-section h1').length,
+ 0,
+ 'Welcome section should contain an h1 element '
+);
+```
+
+在 `#welcome-section` 元素中,你不应该有任何空的 `h1` 元素。
+
+```js
+assert.isAbove(
+ document.querySelectorAll('#welcome-section h1')?.[0]?.innerText?.length,
+ 0,
+ 'h1 element in welcome section should contain your name or camper ' +
+ 'name '
+);
+```
+
+你应该有一个 `id` 为 `projects` 的项目部分。
+
+```js
+const el = document.getElementById('projects')
+assert(!!el);
+```
+
+你的作品集应该包含至少一个 class 为 `project-tile` 的元素。
+
+```js
+assert.isAbove(
+ document.querySelectorAll('#projects .project-tile').length,
+ 0
+);
+```
+
+你的 `#projects` 元素应该包含至少一个 `a` 元素。
+
+```js
+assert.isAbove(document.querySelectorAll('#projects a').length, 0);
+```
+
+你的作品集应该有一个 `id` 为 `navbar` 的导航栏。
+
+```js
+const el = document.getElementById('navbar');
+assert(!!el);
+```
+
+你的 `#navbar` 元素应该包含至少一个 `a` 元素,它的 `href` 属性以 `#` 开头。
+
+```js
+const links = [...document.querySelectorAll('#navbar a')].filter(
+ (nav) => (nav?.getAttribute('href') || '').substr(0, 1) === '#'
+);
+
+assert.isAbove(
+ links.length,
+ 0,
+ 'Navbar should contain an anchor link '
+);
+```
+
+你的作品集应该有一个 `id` 为 `profile-link` 的 `a` 元素。
+
+```js
+const el = document.getElementById('profile-link');
+assert(!!el && el.tagName === 'A')
+```
+
+你的 `#profile-link` 元素应该有一个值为 `_blank` 的 `target` 属性。
+
+```js
+const el = document.getElementById('profile-link');
+assert(!!el && el.target === '_blank')
+```
+
+你的作品集应该至少有一个媒体查询。
+
+```js
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
+```
+
+你的 `#navbar` 元素应该始终位于视口的顶部。
+
+```js
+(async () => {
+ const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
+
+ const navbar = document.getElementById('navbar');
+ assert.approximately(
+ navbar?.getBoundingClientRect().top,
+ 0,
+ 15,
+ "Navbar's parent should be body and it should be at the top of " +
+ 'the viewport '
+ );
+
+ window.scroll(0, 500);
+
+ await timeout(1);
+
+ assert.approximately(
+ navbar?.getBoundingClientRect().top,
+ 0,
+ 15,
+ 'Navbar should be at the top of the viewport even after ' +
+ 'scrolling '
+ );
+ window.scroll(0, 0);
+})();
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+```
+
+```css
+
+```
+
+## --solutions--
+
+```html
+
+
+
+
+
+ Personal Portfolio
+
+
+
+
+
+
+
+
+
+ Welcome to a basic introduction of algebra. In this tutorial, we will
+ review some of the more common algebraic concepts.
+
+
+
+ Definitions
+
+ To start with, let's define some of the more common terms used in
+ algebra:
+
+
+
+ Variable: A variable is an unknown value, usually represented
+ by a letter.
+
+
+ Expression: Essentially a mathematical object. For the
+ purpose of this tutorial, an expression is one part of an equation.
+
+
+ Equation: An equation is a mathematical argument in which two
+ expressions result in the same value.
+
+
+
+
+ Examples
+
+ Sometimes it is easier to understand the definitions when you have a
+ physical example to look at. Here is an example of the above terms.
+ x + 5 = 12
+ In this above example, we have:
+
+
+
Variable: The variable in the example is "x".
+
+ Expression: There are two expressions in this example. They
+ are "x+5" and "12".
+
+
+ Equation: The entire example, "x+5=12", is an equation.
+
+
+
+
+ Solving Equations
+
+ The primary use for algebra is to determine an unknown value, the
+ "variable", with the information provided. Continuing to use our
+ example from above, we can find the value of the variable "x".
+ x + 5 = 12
+ In an equation, both sides result in the same value. So you can
+ manipulate the two expressions however you need, as long as you
+ perform the same operation (or change) to each side. You do this
+ because the goal when solving an equation is to
+ get the variable into its own expression, or by itself on one side
+ of the = sign. For this example, we want to remove the "+5" so the "x" is
+ alone. To do this, we can subtract 5, because subtraction is
+ the opposite operation to addition. But remember, we have to perform
+ the same operation to both sides of the equation. Now our equation
+ looks like this.
+ x + 5 - 5 = 12 - 5
+ The equation looks like a mess right now, because we haven't completed
+ the operations. We can simplify this equation to make it easier
+ to read by performing the operations "5-5" and "12-5". The result
+ is:
+ x = 7
+ We now have our solution to this equation!
+
+
+
+ Solving Equations II
+
+ Let us look at a slightly more challenging equation.
+ 3x + 4 = 13
+ Again we can start with subtraction. In this case, we want to subtract
+ 4 from each side of the equation. We will also go ahead and simplify
+ with each step. So now we have:
+ 3x = 9
+ "3x" translates to "3*x", where the "*" symbol indicates
+ multiplication. We use the "*" to avoid confusion, as the "x" is now a
+ variable instead of a multiplication symbol. The opposite operation
+ for multiplication is division, so we need to
+ divide each expression by 3.
+ x = 3
+ And now we have our solution!
+
+
+
+ Solving Equations III
+
+ Now we are getting in to more complex operations. Here is another
+ equation for us to look at:
+ x^2 - 8 = 8
+ Our very first step will be to add 8 to each side. This is
+ different from our previous examples, where we had to subtract. But
+ remember, our goal is to get the variable alone by performing opposite
+ operations.
+ x^2 = 16
+ But what does the "^2" mean? The "^" symbol is used to denote
+ exponents in situations where superscript is not available. When
+ superscript is available, you would see it as x2.
+ For the sake of this project, however, we will use the "^" symbol.
+ An exponent tells you how many times the base (in our case, "x") is
+ multiplied by itself. So, "x^2" would be the same as "x*x". Now the
+ opposite function of multiplication is division, but we would have to
+ divide both sides by "x". We do not want to do this, as that
+ would put an "x" on the other side of the equation. So instead, we
+ need to use the root operation! For an exponent of "2", we call this
+ the "square root" and denote it with "√". Our equation is now:
+
+ x = √9
+ Performing a root operation by hand can be a tedious process, so we
+ recommend using a calculator when necessary. However, we are lucky in
+ that "9" is a
+ perfect square, so we do not need to calculate anything. Instead, we find our
+ answer to be:
+ x = 3
+
+
+
+ System of Equations
+
+ As you explore your algebra studies further, you may start to run
+ across equations with more than one variable. The first such equations
+ will likely look like:
+ y = 3x
+ An equation like this does not have one single solution.
+ Rather, there are a series of values for which the equation is true.
+ For example, if "x=3" and "y=9", the equation is true. These equations
+ are usually used to plot a graph.
+ Getting more complicated, though, you may be given a pair of
+ equations. This is called a "system of equations", and CAN be solved.
+ Let's look at how we do this! Consider the following system of
+ equations:
+ y = 3x | y - 6 = x
+ A system of equations IS solvable, but it is a multi-step process. To
+ get started, we need to chose a variable we are solving for. Let's
+ solve for "x" first. From the second equation, we know that "x" equals
+ "y - 6", but we cannot simplify that further because we do not have a
+ value for "y". Except, thanks to the system of equations, we DO have a
+ value for "y". We know that "y" equals "3x". So, looking at our second
+ equation, we can replace "y" with "3x" because they have the same
+ value. We then get:
+ 3x - 6 = x
+ Now we can solve for "x"! We start by adding 6 to each side.
+ 3x = x + 6
+ We still need to get "x" by itself, so we subtract "x" from both sides
+ and get:
+ 2x = 6
+ If this confuses you, remember that "3x" is the same as "x+x+x".
+ Subtract an "x" from that and you get "x+x", or "2x". Now we divide
+ both sides by 2 and have our value for x!
+ x = 3
+ However, our work is not done yet. We still need to find the value for
+ "y". Let's go back to our first equation:
+ y = 3x
+ We have a value for "x" now, so let's see what happens if we put that
+ value in.
+ y = 3*3
+ We perform the multiplication and discover that "y=9"! Our solution to
+ this system of equations then is:
+ x = 3 and y = 9
+
+
+
+ Try it Yourself!
+
Coming Soon!
+
Keep an eye out for new additions!
+
+
+ More Information
+
Check out the following links for more information!
+
+
+ Wolfram Alpha
+ is a great source for multiple mathematic fields.
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ background: #f5f6f7;
+ color: #1b1b32;
+ font-family: Helvetica;
+ margin: 0;
+}
+
+header {
+ width: 100%;
+ height: 50px;
+ background-color: #1b1b32;
+ display: flex;
+}
+
+#logo {
+ width: max(100px, 18vw);
+ background-color: #0a0a23;
+ aspect-ratio: 35 / 4;
+ padding: 0.4rem;
+}
+
+h1 {
+ color: #f1be32;
+ font-size: min(5vw, 1.2em);
+}
+
+nav {
+ width: 50%;
+ max-width: 300px;
+ height: 50px;
+}
+
+nav > ul {
+ display: flex;
+ justify-content: space-evenly;
+}
+```
diff --git a/curriculum/challenges/chinese/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/614ccc21ea91ef1736b9b578.md b/curriculum/challenges/chinese/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/614ccc21ea91ef1736b9b578.md
new file mode 100644
index 00000000000..7b4fda53260
--- /dev/null
+++ b/curriculum/challenges/chinese/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/614ccc21ea91ef1736b9b578.md
@@ -0,0 +1,50 @@
+---
+id: 614ccc21ea91ef1736b9b578
+title: 步骤 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+欢迎来到无障碍测试题的第一部分。 你正在成为一个经验丰富的 HTML 和 CSS 开发者,我们从基本的模板带你开始学习这些知识。
+
+通过为你的 `html` 元素添加一个 `lang` 属性来开始这段无障碍之旅。 这将帮助屏幕阅读器识别页面的语言。
+
+# --hints--
+
+你应该给 `html` 元素一个 `lang` 属性。 _提示:对于英文,你可以使用值 `en` 。_
+
+```js
+assert.match(code, //i);
+// TODO: This should/could be fixed in the builder.js
+// assert.notThrow(Intl.getCanonicalLocales(document.querySelector('html').lang));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ background: #f5f6f7;
+ color: #1b1b32;
+ font-family: Helvetica;
+ margin: 0;
+}
+```
diff --git a/curriculum/challenges/chinese/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md b/curriculum/challenges/chinese/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md
new file mode 100644
index 00000000000..e25f956c7aa
--- /dev/null
+++ b/curriculum/challenges/chinese/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md
@@ -0,0 +1,43 @@
+---
+id: 5f33071498eb2472b87ddee4
+title: 第1步:
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+之前在Cat Photo App的最后几个步骤中提过,构建网页前需要一个基本的结构。
+
+添加标签 `` 和元素 `html` 。
+
+# --hints--
+
+需要先声明`DOCTYPE`
+
+```js
+assert(code.match(//i));
+```
+
+需要一个起始标签 ``
+
+```js
+assert(code.match(//i));
+```
+
+需要一个闭合标签 `` 别忘了闭合标签的尖括号 `<` 后需要有一个 `/`
+
+```js
+assert(code.match(/<\/html>/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
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 cdd62359751..9cbd82dc301 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
@@ -1,6 +1,6 @@
---
id: 587d78af367417b2b2512b04
-title: Build a Product Landing Page
+title: Costruire la Landing Page per un prodotto
challengeType: 14
forumTopicId: 301144
dashedName: build-a-product-landing-page
@@ -8,87 +8,87 @@ dashedName: build-a-product-landing-page
# --description--
-**Objective:** Build an app that is functionally similar to https://product-landing-page.freecodecamp.rocks
+**Obbiettivo:** Crea un'app funzionalmente simile a https://product-landing-page.freecodecamp.rocks
-**User Stories:**
+**User story:**
-1. Your product landing page should have a `header` element with a corresponding `id="header"`
-1. You can see an image within the `header` element with a corresponding `id="header-img"` (A logo would make a good image here)
-1. Within the `#header` element, you can see a `nav` element with a corresponding `id="nav-bar"`
-1. You can see at least three clickable elements inside the `nav` element, each with the class `nav-link`
-1. When you click a `.nav-link` button in the `nav` element, you are taken to the corresponding section of the landing page
-1. You can watch an embedded product video with `id="video"`
-1. Your landing page has a `form` element with a corresponding `id="form"`
-1. Within the form, there is an `input` field with `id="email"` where you can enter an email address
-1. The `#email` input field should have placeholder text to let users know what the field is for
-1. The `#email` input field uses HTML5 validation to confirm that the entered text is an email address
-1. Within the form, there is a submit `input` with a corresponding `id="submit"`
-1. When you click the `#submit` element, the email is submitted to a static page (use this mock URL: `https://www.freecodecamp.com/email-submit`)
-1. The navbar should always be at the top of the viewport
-1. Your product landing page should have at least one media query
-1. Your product landing page should utilize CSS flexbox at least once
+1. La pagina di destinazione del prodotto dovrebbe avere un elemento `header` con un corrispondente `id="header"`
+1. Puoi vedere un immagine dentro l'elemento `header` con un attributo corrispondente `id="header-img"` (un logo sarebbe una buona immagine qui)
+1. Dentro l'elemento `#header`, puoi vedere un elemento `nav` con un corrispondente attributo `id="nav-bar"`
+1. Puoi vedere almeno tre elementi cliccabili dentro l'elemento `nav`, ognuno con una classe di `nav-link`
+1. Quando clicchi su un pulsante `.nav-link` dentro l'elemento `nav`, vieni portato alla sezione corrispondente nella pagina
+1. Puoi vedere un video sul prodotto incorporato nella pagina con `id="video"`
+1. La tua pagina ha un elemento `form` con un corrispondente attributo `id="form"`
+1. Dentro il modulo, c'è un campo `input` con un `id="email"` dove puoi inserire un indirizzo email
+1. Il campo input `#email` dovrebbe avere testo segnaposto per far sapere agli utenti per che cosa è il campo
+1. Il campo input `#email` usa la validazione HTML5 per confermare che il testo inserito è un indirizzo email
+1. Dentro il modulo, c'è un `input` per inviare con un corrispondente `id="submit"`
+1. Quando clicchi l'elemento `#submit`, l'email è inviata a una pagina statica (usa l'URL non funzionante: `https://www.freecodecamp.com/email-submit`)
+1. La barra di navigazione dovrebbe essere sempre in cima alla porta di visualizzazione
+1. La tua pagina del prodotto dovrebbe avere almeno un media query
+1. La tua pagina del prodotto dovrebbe utilizzare CSS flexbox almeno una volta
-Fulfill the user stories and pass all the tests below to complete this project. Give it your own personal style. Happy Coding!
+Soddisfa le storie utente e passa tutti i test qua sotto per completare il progetto. Usa il tuo stile personale. Buon divertimento!
# --hints--
-You should have a `header` element with an `id` of `header`
+Dovresti avere un elemento `header` con un `id` di `header`
```js
const el = document.getElementById('header')
assert(!!el && el.tagName === 'HEADER')
```
-You should have an `img` element with an `id` of `header-img`
+Dovresti avere un elemento `img` con un attributo `id` di `header-img`
```js
const el = document.getElementById('header-img')
assert(!!el && el.tagName === 'IMG')
```
-Your `#header-img` should be a descendant of the `#header`
+L'elemento `#header-img` dovrebbe essere un discendente di `#header`
```js
const els = document.querySelectorAll('#header #header-img')
assert(els.length > 0)
```
-Your `#header-img` should have a `src` attribute
+L'elemento `#header-img` dovrebbe avere un attributo `src`
```js
const el = document.getElementById('header-img')
assert(!!el && !!el.src)
```
-Your `#header-img`’s `src` value should be a valid URL (starts with `http`)
+L'attributo `src` dell'elemento `#header-img` dovrebbe essere un URL valido (inizia con `http`)
```js
const el = document.getElementById('header-img')
assert(!!el && /^http/.test(el.src))
```
-You should have a `nav` element with an `id` of `nav-bar`
+Dovresti avere un elemento `nav` con un `id` di `nav-bar`
```js
const el = document.getElementById('nav-bar')
assert(!!el && el.tagName === 'NAV')
```
-Your `#nav-bar` should be a descendant of the `#header`
+Il tuo elemento `#nav-bar` dovrebbe essere un discendente dell'elemento `#header`
```js
const els = document.querySelectorAll('#header #nav-bar')
assert(els.length > 0)
```
-You should have at least 3 `.nav-link` elements within the `#nav-bar`
+Dovresti avere almeno 3 elementi `.nav-link` dentro `#nav-bar`
```js
const els = document.querySelectorAll('#nav-bar .nav-link')
assert(els.length >= 3)
```
-Each `.nav-link` element should have an `href` attribute
+Ogni elemento `.nav-link` dovrebbe avere un attributo `href`
```js
const els = document.querySelectorAll('.nav-link')
@@ -98,7 +98,7 @@ els.forEach(el => {
assert(els.length > 0)
```
-Each `.nav-link` element should link to a corresponding element on the landing page (has an `href` with a value of another element's id. e.g. `#footer`)
+Ogni elemento `.nav-link` dovrebbe essere un collegamento ad un elemento corrispondente nella pagina (cioè ha un attributo `href` con il valore dell'id di un altro elemento, ad esempio `#footer`)
```js
const els = document.querySelectorAll('.nav-link')
@@ -109,91 +109,99 @@ els.forEach(el => {
assert(els.length > 0)
```
-You should have a `video` or `iframe` element with an `id` of `video`
+Dovresti avere un elemento `video` o `iframe` con un `id` di `video`
```js
const el = document.getElementById('video')
assert(!!el && (el.tagName === 'VIDEO' || el.tagName === 'IFRAME'))
```
-Your `#video` should have a `src` attribute
+L'elemento `#video` dovrebbe avere un attributo `src`
```js
-const el = document.getElementById('video')
-assert(!!el && !!el.src)
+let el = document.getElementById('video')
+const sourceNode = el.children;
+let sourceElement = null;
+if (sourceNode.length) {
+ sourceElement = [...video.children].filter(el => el.localName === 'source')[0];
+}
+if (sourceElement) {
+ el = sourceElement;
+}
+assert(el.hasAttribute('src'));
```
-You should have a `form` element with an `id` of `form`
+Dovresti avere un elemento `form` con un attributo `id` di `form`
```js
const el = document.getElementById('form')
assert(!!el && el.tagName === 'FORM')
```
-You should have an `input` element with an `id of `email`
+Dovresti avere un elemento `input` con un `id` di `email`
```js
const el = document.getElementById('email')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#email` should be a descendant of the `#form`
+L'elemento `#email` dovrebbe essere un discendente di `#form`
```js
const els = document.querySelectorAll('#form #email')
assert(els.length > 0)
```
-Your `#email` should have the `placeholder` attribute with placeholder text
+L'elemento `#email`dovrebbe avere un attributo `placeholder` con del testo segnaposto
```js
const el = document.getElementById('email')
assert(!!el && !!el.placeholder && el.placeholder.length > 0)
```
-Your `#email` should use HTML5 validation by setting its `type` to `email`
+L'elemento `#email` dovrebbe usare la validazione HTML5 impostando l'attributo `type` a `email`
```js
const el = document.getElementById('email')
assert(!!el && el.type === 'email')
```
-You should have an `input` element with an `id` of `submit`
+Dovresti avere un elemento `input` con un `id` di `submit`
```js
const el = document.getElementById('submit')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#submit` should be a descendant of the `#form`
+L'elemento `#submit` dovrebbe essere un discendente di `#form`
```js
const els = document.querySelectorAll('#form #submit')
assert(els.length > 0)
```
-Your `#submit` should have a `type` of `submit`
+L'elemento `#submit` dovrebbe avere un attributo `type` con valore di `submit`
```js
const el = document.getElementById('submit')
assert(!!el && el.type === 'submit')
```
-Your `#form` should have an `action` attribute of `https://www.freecodecamp.com/email-submit`
+L'elemento `#form` dovrebbe avere un attributo `action` con valore di `https://www.freecodecamp.com/email-submit`
```js
const el = document.getElementById('form')
assert(!!el && el.action === 'https://www.freecodecamp.com/email-submit')
```
-Your `#email` should have a `name` attribute of `email`
+L'elemento `#email` dovrebbe avere un attributo `name` con valore di `email`
```js
const el = document.getElementById('email')
assert(!!el && el.name === 'email')
```
-Your `#nav-bar` should always be at the top of the viewport
+L'elemento `#nav-bar` dovrebbe sempre essere in cima al viewport
```js
const el = document.getElementById('nav-bar')
@@ -202,13 +210,15 @@ const top2 = el?.offsetTop
assert(!!el && top1 >= -15 && top1 <= 15 && top2 >= -15 && top2 <= 15)
```
-Your Product Landing Page should use at least one media query
+La pagina dovrebbe avere almeno un media query
```js
-assert.isAtLeast(new __helpers.CSSHelp(document).getCSSRules('media')?.length, 1);
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
```
-Your Product Landing Page should use CSS Flexbox at least once
+La tua pagina dovrebbe usare CSS Flexbox almeno una volta
```js
const stylesheet = new __helpers.CSSHelp(document).getStyleSheet()
diff --git a/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-survey-form.md b/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-survey-form.md
index 937c4482c93..79eb105c17d 100644
--- a/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-survey-form.md
+++ b/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-survey-form.md
@@ -1,6 +1,6 @@
---
id: 587d78af367417b2b2512b03
-title: Build a Survey Form
+title: Creare un modulo di sondaggio
challengeType: 14
forumTopicId: 301145
dashedName: build-a-survey-form
@@ -8,277 +8,277 @@ dashedName: build-a-survey-form
# --description--
-**Objective:** Build an app that is functionally similar to https://survey-form.freecodecamp.rocks
+**Obbiettivo:** Crea un'app funzionalmente simile a https://survey-form.freecodecamp.rocks
-**User Stories:**
+**User story:**
-1. You should have a page title in an `h1` element with an `id` of `title`
-1. You should have a short explanation in a `p` element with an `id` of `description`
-1. You should have a `form` element with an `id` of `survey-form`
-1. Inside the form element, you are **required** to enter your name in an `input` field that has an `id` of `name` and a `type` of `text`
-1. Inside the form element, you are **required** to enter your email in an `input` field that has an `id` of `email`
-1. If you enter an email that is not formatted correctly, you will see an HTML5 validation error
-1. Inside the form, you can enter a number in an `input` field that has an `id` of `number`
-1. If you enter non-numbers in the number input, you will see an HTML5 validation error
-1. If you enter numbers outside the range of the number input, which are defined by the `min` and `max` attributes, you will see an HTML5 validation error
-1. For the name, email, and number input fields, you can see corresponding `label` elements in the form, that describe the purpose of each field with the following ids: `id="name-label"`, `id="email-label"`, and `id="number-label"`
-1. For the name, email, and number input fields, you can see placeholder text that gives a description or instructions for each field
-1. Inside the form element, you should have a `select` dropdown element with an `id` of `dropdown` and at least two options to choose from
-1. Inside the form element, you can select an option from a group of at least two radio buttons that are grouped using the `name` attribute
-1. Inside the form element, you can select several fields from a series of checkboxes, each of which must have a `value` attribute
-1. Inside the form element, you are presented with a `textarea` for additional comments
-1. Inside the form element, you are presented with a button with `id` of `submit` to submit all the inputs
+1. Dovresti avere un titolo di pagina in un elemento `h1` con un attributo `id` di `title`
+1. Dovrebbe esserci una breve spiegazione in un elemento `p` con un `id` di `description`
+1. Dovrebbe esserci un elemento `form` con un attributo `id` di `survey-form`
+1. All'interno dell'elemento modulo, ti è **richiesto** di scrivere il tuo nome in un campo `input` che ha un attributo `id` di `name` e un attributo `type` di `text`
+1. All'interno dell'elemento modulo, ti è **richiesto** di inserire la tua email in un campo di `input` che ha un `id` di `email`
+1. Se inserisci una mail che non è formattata correttamente, vedrai un errore di validazione HTML5
+1. All'interno del modulo è possibile inserire un numero in un campo `input` che ha un `id` di `number`
+1. Se entri non-numeri nell'input di numero, vedrai un errore di validazione HTML5
+1. Se immetti un numero al di fuori del range del campo per il numero, che hai definito con gli attributi `min` e `max`, vedrai un errore di validazione HTML5
+1. Per le caselle di input per il nome, la mail e il numero, puoi vedere dei corrispondenti elementi `label` nel modulo che descrivono lo scopo di ogni campo con i seguenti attributi id: `id="name-label"`, `id="email-label"`, e `id="number-label"`
+1. Per i campi di input del nome, mail e numero, puoi vedere del testo segnaposto che da una descrizione o istruzioni per ogni campo
+1. Dentro l'elemento modulo, dovresti vedere un elemento `select` a tendina con un `id` di `dropdown` e almeno due opzioni tra cui scegliere
+1. Dentro l'elemento modulo, puoi selezionare una opzione da un gruppo di almeno due elementi radio che sono raggruppati con l'attributo `name`
+1. All'interno dell'elemento del modulo, è possibile selezionare diversi campi da una serie di caselle di controllo, ciascuno dei quali deve avere un attributo `value`
+1. All'interno del modulo, ti è presentato un elemento `textarea` per commenti aggiuntivi
+1. Dentro l'elemento modulo, puoi vedere un pulsante con un `id` di `submit` per inviare tutti gli input
-Fulfill the user stories and pass all the tests below to complete this project. Give it your own personal style. Happy Coding!
+Soddisfa le user story e passa tutti i test qua sotto per complerare questo progetto. Usa il tuo stile personale. Buon divertimento!
# --hints--
-You should have an `h1` element with an `id` of `title`
+Dovrebbe esserci un elemento `h1` con un `id` di `title`
```js
const el = document.getElementById('title')
assert(!!el && el.tagName === 'H1')
```
-Your `#title` should not be empty
+Il tuo elemento `#title` non dovrebbe essere vuoto
```js
const el = document.getElementById('title')
assert(!!el && el.innerText.length > 0)
```
-You should have a `p` element with an `id` of `description`
+Dovrebbe esserci un elemento `p` con un `id` di `description`
```js
const el = document.getElementById('description')
assert(!!el && el.tagName === 'P')
```
-Your `#description` should not be empty
+L'elemento `#description` non dovrebbe essere vuoto
```js
const el = document.getElementById('description')
assert(!!el && el.innerText.length > 0)
```
-You should have a `form` element with an `id` of `survey-form`
+Dovrebbe esserci un elemento `form` con un attributo `id` di `survey-form`
```js
const el = document.getElementById('survey-form')
assert(!!el && el.tagName === 'FORM')
```
-You should have an `input` element with an `id` of `name`
+Dovresti avere un elemento `input` con un `id` di `name`
```js
const el = document.getElementById('name')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#name` should have a `type` of `text`
+L'elemento `#name` dovrebbe avere un attributo `type` con valore di `text`
```js
const el = document.getElementById('name')
assert(!!el && el.type === 'text')
```
-Your `#name` should require input
+L'elemento `#name` dovrebbe richiedere un input
```js
const el = document.getElementById('name')
assert(!!el && el.required)
```
-Your `#name` should be a descedant of `#survey-form`
+L'elemento `#name` dovrebbe essere un discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form #name')
assert(!!el)
```
-You should have an `input` element with an `id` of `email`
+Dovresti avere un elemento `input` con un `id` di `email`
```js
const el = document.getElementById('email')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#email` should have a `type` of `email`
+L'elemento `#email` dovrebbe avere un attributo `type` con valore di `email`
```js
const el = document.getElementById('email')
assert(!!el && el.type === 'email')
```
-Your `#email` should require input
+L'elemento `#email` dovrebbe richiedere un input
```js
const el = document.getElementById('email')
assert(!!el && el.required)
```
-Your `#email` should be a descedant of `#survey-form`
+L'elemento `#email` dovrebbe essere un discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form #email')
assert(!!el)
```
-You should have an `input` element with an `id` of `number`
+Dovresti avere un elemento `input` con un `id` di `number`
```js
const el = document.getElementById('number')
assert(!!el && el.tagName === 'INPUT')
```
-Your `#number` should be a descedant of `#survey-form`
+L'elemento `#number` dovrebbe essere un discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form #number')
assert(!!el)
```
-Your `#number` should have a `type` of `number`
+L'elemento `#number` dovrebbe avere un attributo `type` con valore di `number`
```js
const el = document.getElementById('number')
assert(!!el && el.type === 'number')
```
-Your `#number` should have a `min` attribute with a numeric value
+L'elemento `#number` dovrebbe avere un attributo `min` con un valore numerico
```js
const el = document.getElementById('number')
assert(!!el && el.min && isFinite(el.min))
```
-Your `#number` should have a `max` attribute with a numeric value
+L'elemento `#number` dovrebbe avere un attributo `max` con un valore numerico
```js
const el = document.getElementById('number')
assert(!!el && el.max && isFinite(el.max))
```
-You should have a `label` element with an `id` of `name-label`
+Dovresti avere un elemento `label` con un `id` di `name-label`
```js
const el = document.getElementById('name-label')
assert(!!el && el.tagName === 'LABEL')
```
-You should have a `label` element with an `id` of `email-label`
+Dovresti avere un elemento `label` con un `id` di `email-label`
```js
const el = document.getElementById('email-label')
assert(!!el && el.tagName === 'LABEL')
```
-You should have a `label` element with an `id` of `number-label`
+Dovresti avere un elemento `label` con un `id` di `number-label`
```js
const el = document.getElementById('number-label')
assert(!!el && el.tagName === 'LABEL')
```
-Your `#name-label` should not be empty
+L'elemento `#name-label` non dovrebbe essere vuoto
```js
const el = document.getElementById('name-label')
assert(!!el && el.innerText.length > 0)
```
-Your `#email-label` should not be empty
+L'elemento `#email-label` non dovrebbe essere vuoto
```js
const el = document.getElementById('email-label')
assert(!!el && el.innerText.length > 0)
```
-Your `#number-label` should not be empty
+L'elemento `#number-label` non dovrebbe essere vuoto
```js
const el = document.getElementById('number-label')
assert(!!el && el.innerText.length > 0)
```
-Your `#name-label` should be a descedant of `#survey-form`
+L'elemento `#name-label` dovrebbe essere un discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form #name-label')
assert(!!el)
```
-Your `#email-label` should be a descedant of `#survey-form`
+L'elemento `#email-label` dovrebbe essere un discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form #email-label')
assert(!!el)
```
-Your `#number-label` should be a descedant of `#survey-form`
+L'elemento `#number-label` dovrebbe essere un discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form #number-label')
assert(!!el)
```
-Your `#name` should have a `placeholder` attribute and value
+L'elemento `#name` dovrebbe avere un attributo `placeholder` con un valore
```js
const el = document.getElementById('name')
assert(!!el && !!el.placeholder && el.placeholder.length > 0)
```
-Your `#email` should have a `placeholder` attribute and value
+L'elemento `#email` dovrebbe avere un attributo `placeholder` con un valore
```js
const el = document.getElementById('email')
assert(!!el && !!el.placeholder && el.placeholder.length > 0)
```
-Your `#number` should have a `placeholder` attribute and value
+L'elemento `#number` dovrebbe avere un attributo `placeholder` con un valore
```js
const el = document.getElementById('number')
assert(!!el && !!el.placeholder && el.placeholder.length > 0)
```
-You should have a `select` field with an `id` of `dropdown`
+Dovrebbe esserci un campo `select` con un `id` di `dropdown`
```js
const el = document.getElementById('dropdown')
assert(!!el && el.tagName === 'SELECT')
```
-Your `#dropdown` should have at least two selectable (not disabled) `option` elements
+L'elemento `#dropdown` dovrebbe avere almeno due elementi `option` selezionabili (non disattivati)
```js
const els = document.querySelectorAll('#dropdown option:not([disabled])')
assert(els.length >= 2)
```
-Your `#dropdown` should be a descendant of `#survey-form`
+L'elemento `#dropdown` dovrebbe essere un discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form #dropdown')
assert(!!el)
```
-You should have at least two `input` elements with a `type` of `radio` (radio buttons)
+Dovresti avere almeno due elementi `input` con un attributo `type` di `radio` (pulsanti radio)
```js
const els = document.querySelectorAll('input[type="radio"]')
assert(els.length >= 2)
```
-You should have at least two radio buttons that are descendants of `#survey-form`
+Dovresti avere almeno due pulsanti radio che sono discendenti di `#survey-form`
```js
const els = document.querySelectorAll('#survey-form input[type="radio"]')
assert(els.length >= 2)
```
-All your radio buttons should have a `value` attribute and value
+Tutti i tuoi pulsanti radio dovrebbero avere un attributo `value` con un valore
```js
const els1 = document.querySelectorAll('input[type="radio"]')
@@ -286,7 +286,7 @@ const els2 = document.querySelectorAll('input[type="radio"][value=""], input[typ
assert(els1.length > 0 && els2.length === 0)
```
-All your radio buttons should have a `name` attribute and value
+Tutti i tuoi pulsanti radio dovrebbero avere un attributo `name` con un valore
```js
const els1 = document.querySelectorAll('input[type="radio"]')
@@ -294,7 +294,7 @@ const els2 = document.querySelectorAll('input[type="radio"][name=""], input[type
assert(els1.length > 0 && els2.length === 0)
```
-Every radio button group should have at least 2 radio buttons
+Ogni gruppo di pulsanti radio dovrebbe avere almeno 2 pulsanti radio
```js
const radioButtons = document.querySelectorAll('input[type="radio"]');
@@ -316,14 +316,14 @@ groupKeys.forEach(key => {
assert(groupKeys.length > 0)
```
-You should have at least two `input` elements with a `type` of `checkbox` (checkboxes) that are descendants of `#survey-form`
+Dovresti avere almeno due elementi `input` con un attributo `type` di `checkbox` (caselle a scelta multipla) che sono discendenti di `#survey-form`
```js
const els = document.querySelectorAll('#survey-form input[type="checkbox"]');
assert(els.length >= 2)
```
-All your checkboxes inside `#survey-form` should have a `value` attribute and value
+Tutte le tue caselle checkbox dentro l'elemento `#survey-form` dovrebbero avere un attributo `value` con un valore
```js
const els1 = document.querySelectorAll('#survey-form input[type="checkbox"]')
@@ -331,28 +331,28 @@ const els2 = document.querySelectorAll('#survey-form input[type="checkbox"][valu
assert(els1.length > 0 && els2.length === 0)
```
-You should have at least one `textarea` element that is a descendant of `#survey-form`
+Dovrebbe esserci almeno un elemento `textarea` discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form textarea')
assert(!!el)
```
-You should have an `input` or `button` element with an `id` of `submit`
+Dovrebbe esserci un elemento `input` o `button` con un `id` di `submit`
```js
const el = document.getElementById('submit')
assert(!!el && (el.tagName === 'INPUT' || el.tagName === 'BUTTON'))
```
-Your `#submit` should have a `type` of `submit`
+L'elemento `#submit` dovrebbe avere un attributo `type` con valore di `submit`
```js
const el = document.getElementById('submit')
assert(!!el && el.type === 'submit')
```
-Your `#submit` should be a descendant of `#survey-form`
+L'elemento `#submit` dovrebbe essere un discendente di `#survey-form`
```js
const el = document.querySelector('#survey-form #submit')
diff --git a/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md b/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
index 6c433375ba7..7a6cab0f04e 100644
--- a/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
+++ b/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-technical-documentation-page.md
@@ -1,6 +1,6 @@
---
id: 587d78b0367417b2b2512b05
-title: Build a Technical Documentation Page
+title: Creare una pagina di documentazione tecnica
challengeType: 14
forumTopicId: 301146
dashedName: build-a-technical-documentation-page
@@ -8,45 +8,45 @@ dashedName: build-a-technical-documentation-page
# --description--
-**Objective:** Build an app that is functionally similar to https://technical-documentation-page.freecodecamp.rocks
+**Obbiettivo:** Crea un'app funzionalmente simile a https://technical-documentation-page.freecodecamp.rocks
-**User Stories:**
+**User story:**
-1. You can see a `main` element with a corresponding `id="main-doc"`, which contains the page's main content (technical documentation)
-1. Within the `#main-doc` element, you can see several `section` elements, each with a class of `main-section`. There should be a minimum of five
-1. The first element within each `.main-section` should be a `header` element, which contains text that describes the topic of that section.
-1. Each `section` element with the class of `main-section` should also have an `id` that corresponds with the text of each `header` contained within it. Any spaces should be replaced with underscores (e.g. The section that contains the header "JavaScript and Java" should have a corresponding `id="JavaScript_and_Java"`)
-1. The `.main-section` elements should contain at least ten `p` elements total (not each)
-1. The `.main-section` elements should contain at least five `code` elements total (not each)
-1. The `.main-section` elements should contain at least five `li` items total (not each)
-1. You can see a `nav` element with a corresponding `id="navbar"`
-1. The navbar element should contain one `header` element which contains text that describes the topic of the technical documentation
-1. Additionally, the navbar should contain link (`a`) elements with the class of `nav-link`. There should be one for every element with the class `main-section`
-1. The `header` element in the `#navbar` must come before any link (`a`) elements in the navbar
-1. Each element with the class of `nav-link` should contain text that corresponds to the `header` text within each `section` (e.g. if you have a "Hello world" section/header, your navbar should have an element which contains the text "Hello world")
-1. When you click on a navbar element, the page should navigate to the corresponding section of the `main-doc` element (e.g. If you click on a `nav-link` element that contains the text "Hello world", the page navigates to a `section` element with that id, and contains the corresponding header)
-1. On regular sized devices (laptops, desktops), the element with `id="navbar"` should be shown on the left side of the screen and should always be visible to the user
-1. Your technical documentation should use at least one media query
+1. Puoi vedere un elemento `main` con un corrispondente `id="main-doc"`, che contiene il contenuto principale della pagina (documentazione tecnica)
+1. Dentro l'elemento `#main-doc`, puoi vedere svariati elementi `section`, ognuno con una classe di `main-section`. Dovrebbero esserne almeno cinque
+1. Il primo elemento dentro ogni `.main-section` dovrebbe essere un elemento `header`, che contiene testo che descrive l'argomento della sezione.
+1. Ogni elemento `section` con una classe di `main-section` dovrebbe avere un `id` che corrisponde al testo di ogni elemento `header` al suo interno. Qualsiasi spazio deve essere sostituito con un underscore (ad es. La sezione section che contiene l'intestazione "JavaScript e Java" dovrebbe avere un corrispondente `id="JavaScript_and_Java"`)
+1. Gli elementi `.main-section` dovrebbero contenere almeno dieci elementi `p` in totale (non ognuno)
+1. Gli elementi `.main-section` dovrebbero contenere almeno cinque elementi `code` in totale (non ognuno)
+1. Gli elementi `.main-section` dovrebbero contenere almeno cinque elementi `li` in totale (non ognuno)
+1. Puoi vedere un elemento `nav` con un corrispondente `id="navbar"`
+1. L'elemento barra di navigazione dovrebbe contenere un elemento `header` che contiene del testo che descrive l'argomento della documentazione tecnica
+1. In aggiunta, la barra di navigazione dovrebbe contenere dei link (elementi `a`) con la classe di `nav-link`. Dovrebbe essercene uno per ogni elemento di classe `main-section`
+1. L'elemento `header` dentro `#navbar` deve venire prima di qualsiasi link (elemento `a`) nella barra di navigazione
+1. Ogni elemento con la classe `nav-link` dovrebbe contenere del testo che corrisponde al testo dell'elemento `header` dentro ogni elemento `section` (per esempio, se c'è una sezione/intestazione "Hello world", la barra di navigazione dovrebbe avere un elemento che contiene il testo "Hello world")
+1. Quando clicchi su un elemento della barra di navigazione, la pagina dovrebbe navigare alla sezione corrispondente dell'elemento `#main-doc` (per esempio se clicchi su un elemento `.nav-link` che contiene il testo "Hello world", la pagina naviga all'elemento `section` che ha quell'id, e contiene l'intestazione corrispondente)
+1. Su dispositivi di dimensione regolare (laptop, desktop), l'elemeneto con `id="navbar"` dovrebbe essere sempre mostrato nella parte destra dello schermo e dovrebbe essere sempre visibile all'utente
+1. La tua documentazione tecnica dovrebbe usare almeno un media query
-Fulfill the user stories and pass all the tests below to complete this project. Give it your own personal style. Happy Coding!
+Soddisfa le user story e passa tutti i test qua sotto per complerare questo progetto. Usa il tuo stile personale. Buon divertimento!
# --hints--
-You should have a `main` element with an `id` of `main-doc`
+Dovresti avere un elemento `main` con un `id` di `main-doc`
```js
const el = document.getElementById('main-doc')
assert(!!el)
```
-You should have at least five `section` elements with a class of `main-section`
+Dovresti avere almeno cinque elementi `section` con una classe di `main-section`
```js
const els = document.querySelectorAll('#main-doc section')
assert(els.length >= 5)
```
-All of your `.main-section` elements should be `section` elements
+Tutti gli elementi `.main-section` dovrebbero essere elementi `section`
```js
const els = document.querySelectorAll('.main-section')
@@ -56,14 +56,14 @@ els.forEach(el => {
assert(els.length > 0)
```
-You should have at least five `.main-section` elements that are descendants of `#main-doc`
+Dovrebbero esserci almeno cinque elementi `.main-section` che sono discendenti di `#main-doc`
```js
const els = document.querySelectorAll('#main-doc .main-section')
assert(els.length >= 5)
```
-The first child of each `.main-section` should be a `header` element
+Il primo figlio di ogni elemento `.main-section` dovrebbe essere un elemento `header`
```js
const els = document.querySelectorAll('.main-section')
@@ -73,7 +73,7 @@ els.forEach(el => {
assert(els.length > 0)
```
-None of your `header` elements should be empty
+Non dovrebbe esserci nessun elemento `header` che sia vuoto
```js
const els = document.querySelectorAll('header')
@@ -83,7 +83,7 @@ els.forEach(el => {
assert(els.length > 0)
```
-All of your `.main-section` elements should have an `id`
+Tutti gli elementi `.main-section` dovrebbero avere un `id`
```js
const els = document.querySelectorAll('.main-section')
@@ -93,7 +93,7 @@ els.forEach(el => {
assert(els.length > 0)
```
-Each `.main-section` should have an `id` that matches the text of its first child, having any spaces in the child's text replaced with underscores (`_`) for the id’s
+Ogni elemento `.main-section` dovrebbe avere un `id` che corrisponde con il testo del primo figlio, sostituendo ogni spazio nel testo del figlio con i trattini bassi (`_`)
```js
const els = document.querySelectorAll('.main-section')
@@ -104,49 +104,49 @@ els.forEach(el => {
assert(els.length > 0)
```
-You should have at least 10 `p` elements (total) within your `.main-section` elements
+Dovresti avere almeno 10 elementi `p` (in totale) dentro i tuoi elementi `.main-section`
```js
const els = document.querySelectorAll('.main-section p')
assert(els.length >= 10)
```
-You should have at least five `code` elements that are descendants of `.main-section` elements
+Dovresti avere almeno cinque elementi `code` che sono discendenti degli elementi `.main-section`
```js
const els = document.querySelectorAll('.main-section code')
assert(els.length >= 5)
```
-You should have at least five `li` elements that are descendants of `.main-section` elements
+Dovrebbero esserci almeno cinque elementi `li` che sono discendenti degli elementi `.main-section`
```js
const els = document.querySelectorAll('.main-section li')
assert(els.length >= 5)
```
-You should have a `nav` element with an `id` of `navbar`
+Dovrebbe esserci un elemento `nav` con un attributo `id` con valore di `navbar`
```js
const el = document.getElementById('navbar')
assert(!!el && el.tagName === 'NAV')
```
-Your `#navbar` should have exactly one `header` element within it
+L'elemento `#navbar` dovrebbe avere un solo elemento `header` dentro di esso
```js
const els = document.querySelectorAll('#navbar header')
assert(els.length === 1)
```
-You should have at least one `a` element with a class of `nav-link`
+Dovrebbe esserci almeno un elemento `a` con una classe di `nav-link`
```js
const els = document.querySelectorAll('a[class="nav-link"]')
assert(els.length >= 1)
```
-All of your `.nav-link` elements should be anchor (`a`) elements
+Tutti gli elementi `.nav-link` dovrebbero essere elementi di ancoraggio (`a`)
```js
const els = document.querySelectorAll('.nav-link')
@@ -156,7 +156,7 @@ els.forEach(el => {
assert(els.length > 0)
```
-All of your `.nav-link` elements should be in the `#navbar`
+Tutti gli elementi `.nav-link` dovrebbero essere dentro `#navbar`
```js
const els1 = document.querySelectorAll('.nav-link')
@@ -164,7 +164,7 @@ const els2 = document.querySelectorAll('#navbar .nav-link')
assert(els2.length > 0 && els1.length === els2.length)
```
-You should have the same number of `.nav-link` and `.main-section` elements
+Dovresti avere lo stesso numero di elementi `.nav-link` e di elementi `.main-section`
```js
const els1 = document.querySelectorAll('.main-section')
@@ -172,7 +172,7 @@ const els2 = document.querySelectorAll('.nav-link')
assert(els1.length > 0 && els2.length > 0 && els1.length === els2.length)
```
-The `header` element in the `#navbar` should come before any link (`a`) elements also in the `#navbar`
+L'elemento `header` dentro `#navbar` dovrebbe venire prima di qualsiasi elemento link (`a`) che si trova dentro `#navbar`
```js
const navLinks = document.querySelectorAll('#navbar a.nav-link');
@@ -188,7 +188,7 @@ navLinks.forEach((navLink) => {
assert(!!header)
```
-Each `.nav-link` should have text that corresponds to the `header` text of its related `section` (e.g. if you have a "Hello world" section/header, your `#navbar` should have a `.nav-link` which has the text "Hello world")
+Ogni elemento `.nav-link` dovrebbe avere del testo che corrisponde all'elemento `header` del relativo elemento `section` (per esempio, se hai una sezione/intestazione con "Hello world", l'elemento `#navbar` dovrebbe avere un elemento `.nav-link` con il testo "Hello world")
```js
const headerText = Array.from(document.querySelectorAll('.main-section')).map(el =>
@@ -201,7 +201,7 @@ const remainder = headerText.filter(str => linkText.indexOf(str) === -1)
assert(headerText.length > 0 && headerText.length > 0 && remainder.length === 0)
```
-Each `.nav-link` should have an `href` attribute that links to its corresponding `.main-section` (e.g. If you click on a `.nav-link` element that contains the text "Hello world", the page navigates to a `section` element with that id)
+Ogni elemento `.nav-link` dovrebbe avere un attributo `href` che linca all'elemento `.main-section` corrispondente (per esempio, se clicchi su un elemento `.nav-link` che contiene il testo "Hello world", la pagina naviga all'elemento `section` con quell'id)
```js
const hrefValues = Array.from(document.querySelectorAll('.nav-link')).map(el => el.getAttribute('href'))
@@ -210,7 +210,7 @@ const missingHrefValues = mainSectionIDs.filter(str => hrefValues.indexOf('#' +
assert(hrefValues.length > 0 && mainSectionIDs.length > 0 && missingHrefValues.length === 0)
```
-Your `#navbar` should always be on the left edge of the window
+L'elemento `#navbar` dovrebbe sempre essere sul bordo sinistro della finestra
```js
const el = document.getElementById('navbar')
@@ -219,10 +219,12 @@ const left2 = el?.offsetLeft
assert(!!el && left1 >= -15 && left1 <= 15 && left2 >= -15 && left2 <= 15)
```
-Your Technical Documentation project should use at least one media query
+Il progetto di documentazione tecnica dovrebbe usare almeno un media query
```js
-assert.isAtLeast(new __helpers.CSSHelp(document).getCSSRules('media')?.length, 1);
+const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media'))
+const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media')
+assert(cssCheck.length > 0 || htmlSourceAttr.length > 0);
```
# --seed--
diff --git a/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md b/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
index 231292b4373..a28198a65a6 100644
--- a/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
+++ b/curriculum/challenges/italian/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md
@@ -1,6 +1,6 @@
---
id: bd7158d8c442eddfaeb5bd18
-title: Build a Tribute Page
+title: Costruire una pagina di tributo
challengeType: 14
forumTopicId: 301147
dashedName: build-a-tribute-page
@@ -8,32 +8,32 @@ dashedName: build-a-tribute-page
# --description--
-**Objective:** Build an app that is functionally similar to https://tribute-page.freecodecamp.rocks
+**Obbiettivo:** Crea un'app funzionalmente simile a https://tribute-page.freecodecamp.rocks
-**User Stories:**
+**User story:**
-1. Your tribute page should have an element with a corresponding `id="main"`, which contains all other elements
-1. You should see an element with an `id` of `title`, which contains a string (i.e. text), that describes the subject of the tribute page (e.g. "Dr. Norman Borlaug")
-1. You should see either a `figure` or a `div` element with an `id` of `img-div`
-1. Within the `img-div` element, you should see an `img` element with a corresponding `id="image"`
-1. Within the `img-div` element, you should see an element with a corresponding `id="img-caption"` that contains textual content describing the image shown in `img-div`
-1. You should see an element with a corresponding `id="tribute-info"`, which contains textual content describing the subject of the tribute page
-1. You should see an a element with a corresponding `id="tribute-link"`, which links to an outside site, that contains additional information about the subject of the tribute page. HINT: You must give your element an attribute of `target` and set it to `_blank` in order for your link to open in a new tab
-1. Your `#image` should use `max-width` and `height` properties to resize responsively, relative to the width of its parent element, without exceeding its original size
-1. Your `img` element should be centered within its parent element
+1. La pagina di tributo dovrebbe avere un elemento con un corrispondente `id="main"` che contiene tutti gli altri elementi
+1. Dovresti vedere un elemento con un attributo `id` di `title`, che contiene una stringa (cioè del testo) che descrive il soggetto della pagina di tributo (per esempio "Dr. Normal Borlaug")
+1. Dovresti vedere o un elemento `figure` o un elemento `div` con un attributo `id` di `img-div`
+1. Dentro l'elemento `img-div`, dovresti vedere un elemento `img` con un corrispondente `id="image"`
+1. Dentro l'elemento `img-div`, dovresti vedere un elemento con un corrispondente attributo `id="img-caption"` che contiene contenuto testuale che descrive l'immagine mostrata in `img-div`
+1. Dovresti vedere un elemento con un corrispondente attributo `id="tribute-info"` che contiene contenuto testuale descrivente il soggetto della pagina tributo
+1. Dovresti vedere un elemento con un corrispondente attributo `id="tribute-link"` che linka ad un sito esterno che contiene informazioni aggiuntive sul soggetto della pagina tributo. Suggerimento: Devi dare al tuo elemento un attributo `target` e impostarlo a `_blank` per far si che il link apra in una scheda nuova
+1. Il tio elemento `#image` dovrebbe usare le proprietà `max-width` e `height` per ridimensionarsi in maniera responsiva, relativa alla larghezza dell'elemento genitore senza eccedere la dimensione originale
+1. Il tuo elemento `img` dovrebbe essere centrato dentro il suo elemento genitore
-Fulfill the user stories and pass all the tests below to complete this project. Give it your own personal style. Happy Coding!
+Soddisfa le user story e passa tutti i test qua sotto per complerare questo progetto. Usa il tuo stile personale. Buon divertimento!
# --hints--
-You should have a `main` element with an `id` of `main`
+Dovrebbe esserci un elemento `main` con un `id` di `main`
```js
const el = document.getElementById('main')
assert(!!el && el.tagName === 'MAIN')
```
-Your `#img-div`, `#image`, `#img-caption`, `#tribute-info`, and `#tribute-link` should all be descendants of `#main`
+Gli elementi `#img-div`, `#image`, `#img-caption`, `#tribute-info`, e `#tribute-link` dovrebbero essere tutti discendenti di `#main`
```js
const el1 = document.querySelector('#main #img-div')
@@ -44,14 +44,14 @@ const el5 = document.querySelector('#main #tribute-link')
assert(!!el1 & !!el2 && !!el3 && !!el4 && !!el5)
```
-You should have an element with an `id` of `title`
+Dovresti avere un elemento con un attributo `id` avente valore di `title`
```js
const el = document.getElementById('title')
assert(!!el)
```
-Your `#title` should not be empty
+Il tuo elemento `#title` non dovrebbe essere vuoto
```js
const el = document.getElementById('title')
@@ -59,120 +59,116 @@ assert(!!el && el.innerText.length > 0)
```
-You should have a `figure` or `div` element with an `id` of `img-div`
+Dovrebbe esserci o un elemento `figure` o un elemento `div` con un attributo `id` di `img-div`
```js
const el = document.getElementById('img-div')
assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGURE'))
```
-You should have an `img` element with an `id` of `image`
+Dovrebbe esserci un elemento `img` con un `id` di `image`
```js
const el = document.getElementById('image')
assert(!!el && el.tagName === 'IMG')
```
-Your `#image` should be a descendant of `#img-div`
+Il tuo elemento `#image` dovrebbe essere un discendente di `#img-div`
```js
const el = document.querySelector('#img-div #image')
assert(!!el)
```
-You should have a `figcaption` or `div` element with an `id` of `img-caption`
+Dovrebbe esserci o un elemento `figcaption` o un elemento `div` con un attributo `id` di `img-caption`
```js
const el = document.getElementById('img-caption')
assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGCAPTION'))
```
-Your `#img-caption` should be a descendant of `#img-div`
+L'elemento `#img-caption` dovrebbe essere un discendente di `#img-div`
```js
const el = document.querySelector('#img-div #img-caption')
assert(!!el)
```
-Your `#img-caption` should not be empty
+L'elemento `#img-caption` non dovrebbe essere vuoto
```js
const el = document.getElementById('img-caption')
assert(!!el && el.innerText.length > 0)
```
-You should have an element with an `id` of `tribute-info`
+Dovrevve esserci un elemento con un attributo `id` di `tribute-info`
```js
const el = document.getElementById('tribute-info')
assert(!!el)
```
-Your `#tribute-info` should not be empty
+L'elemento `#tribute-info` non dovrebbe essere vuoto
```js
const el = document.getElementById('tribute-info')
assert(!!el && el.innerText.length > 0)
```
-You should have an `a` element with an `id` of `tribute-link`
+Dovrebbe esserci un elemento `a` con un `id` di `tribute-link`
```js
const el = document.getElementById('tribute-link')
assert(!!el && el.tagName === 'A')
```
-Your `#tribute-link` should have an `href` attribute and value
+L'elemento `#tribute-link` dovrebbe avere un attributo `href` con un valore
```js
const el = document.getElementById('tribute-link')
assert(!!el && !!el.href && el.href.length > 0)
```
-Your `#tribute-link` should have a `target` attribute set to `_blank`
+L'elemento `#tribute-link` dovrebbe avere un attributo `target` di `_blank`
```js
const el = document.getElementById('tribute-link')
assert(!!el && el.target === '_blank')
```
-You should use an `#image` selector in your CSS to style the `#image` and pass the next three tests
+Il tuo elemento `img` dovrebbe avere una proprietà `display` di `block`
```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')
-assert(!!style)
-```
-
-Your `#image` should have a `display` of `block`
-
-```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('display')
+const img = document.getElementById('image');
+const imgStyle = window.getComputedStyle(img);
+const style = imgStyle?.getPropertyValue('display')
assert(style === 'block')
```
-Your `#image` should have a `max-width` of `100%`
+`#image` dovrebbe avere una proprietà `max-width` di `100%`
```js
-const style = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('max-width')
+const img = document.getElementById('image');
+const imgStyle = window.getComputedStyle(img);
+const style = imgStyle?.getPropertyValue('max-width')
assert(style === '100%')
```
-Your `#image` should have a `height` of `auto`
+`#image` dovrebbe avere una proprietà `height` di `auto`
```js
// taken from the testable-projects repo
const img = document.getElementById('image');
-const maxWidthValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('max-width')
-const displayValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('display')
-const oldDisplayValue = img?.style.getPropertyValue('display');
-const oldDisplayPriority = img?.style.getPropertyPriority('display');
+const imgStyle = window.getComputedStyle(img);
+const oldDisplayValue = imgStyle.getPropertyValue('display');
+const oldDisplayPriority = imgStyle.getPropertyPriority('display');
img?.style.setProperty('display', 'none', 'important');
-const heightValue = new __helpers.CSSHelp(document).getStyle('#image')?.getPropertyValue('height')
+const heightValue = imgStyle?.getPropertyValue('height')
img?.style.setProperty('display', oldDisplayValue, oldDisplayPriority);
assert(heightValue === 'auto')
```
-Your `#image` should be centered within its parent
+L'elemento `#image` dovrebbe essere centrato dentro l'elemento genitore
```js
// taken from the testable-projects repo
diff --git a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
index 92ee5db13f9..368f71db799 100644
--- a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
+++ b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md
@@ -17,19 +17,19 @@ Inizializza le tre variabili `a`, `b` e `c` con `5`, `10`, e `"I am a"` rispetti
# --hints--
-`a` dovrebbe essere definito e avere il valore `6`.
+La variabile `a` dovrebbe essere definita e avere un valore finale di `6`.
```js
assert(typeof a === 'number' && a === 6);
```
-`b` dovrebbe essere definito e avere il valore `15`.
+La variabile `b` dovrebbe essere definita e avere un valore finale di `15`.
```js
assert(typeof b === 'number' && b === 15);
```
-`c` non dovrebbe contenere `undefined` e dovrebbe avere un valore stringa `I am a String!`
+`c` non dovrebbe contenere `undefined` e dovrebbe avere un valore finale della stringa `I am a String!`
```js
assert(!/undefined/.test(c) && c === 'I am a String!');
diff --git a/curriculum/challenges/italian/10-coding-interview-prep/data-structures/perform-a-subset-check-on-two-sets-of-data.md b/curriculum/challenges/italian/10-coding-interview-prep/data-structures/perform-a-subset-check-on-two-sets-of-data.md
index 2ebbc5d2e15..d61c290817f 100644
--- a/curriculum/challenges/italian/10-coding-interview-prep/data-structures/perform-a-subset-check-on-two-sets-of-data.md
+++ b/curriculum/challenges/italian/10-coding-interview-prep/data-structures/perform-a-subset-check-on-two-sets-of-data.md
@@ -25,7 +25,7 @@ assert(
);
```
-Il primo `Set` dovrebbe essere contenuto nel secondo `Set`
+Il primo `Set` dovrebbe essere contenuto nel secondo `Set`.
```js
assert(
@@ -43,7 +43,7 @@ assert(
);
```
-`['a', 'b'].isSubsetOf(['a', 'b', 'c', 'd'])` dovrebbe restituire `true`
+`['a', 'b'].isSubsetOf(['a', 'b', 'c', 'd'])` dovrebbe restituire `true`.
```js
assert(
@@ -62,7 +62,7 @@ assert(
);
```
-`['a', 'b', 'c'].isSubsetOf(['a', 'b'])` dovrebbe restituire `false`
+`['a', 'b', 'c'].isSubsetOf(['a', 'b'])` dovrebbe restituire `false`.
```js
assert(
@@ -80,7 +80,7 @@ assert(
);
```
-`[].isSubsetOf([])` dovrebbe restituire `true`
+`[].isSubsetOf([])` dovrebbe restituire `true`.
```js
assert(
@@ -93,7 +93,7 @@ assert(
);
```
-`['a', 'b'].isSubsetOf(['c', 'd'])` dovrebbe restituire `false`
+`['a', 'b'].isSubsetOf(['c', 'd'])` dovrebbe restituire `false`.
```js
assert(
diff --git a/curriculum/challenges/italian/10-coding-interview-prep/project-euler/problem-421-prime-factors-of-n151.md b/curriculum/challenges/italian/10-coding-interview-prep/project-euler/problem-421-prime-factors-of-n151.md
index 33eedf3507f..b2020b0d7d9 100644
--- a/curriculum/challenges/italian/10-coding-interview-prep/project-euler/problem-421-prime-factors-of-n151.md
+++ b/curriculum/challenges/italian/10-coding-interview-prep/project-euler/problem-421-prime-factors-of-n151.md
@@ -1,6 +1,6 @@
---
id: 5900f5131000cf542c510024
-title: 'Problema 421: fattori primi di n15+1'
+title: 'Problema 421: fattori primi di n^15+1'
challengeType: 5
forumTopicId: 302091
dashedName: problem-421-prime-factors-of-n151
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md
new file mode 100644
index 00000000000..6c98c6184f2
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f332a88dc25a0fd25c7687a.md
@@ -0,0 +1,62 @@
+---
+id: 5f332a88dc25a0fd25c7687a
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Per far sapere ai visitatori che il bar è stato fondato nel 2020, aggiungi un elemento `p` sotto l'elemento `h1` con il testo `Est. 2020`.
+
+# --hints--
+
+Dovresti avere un tag di apertura `
`.
+
+```js
+assert(code.match(/
/i));
+```
+
+Dovresti avere un tag di chiusura `
`.
+
+```js
+assert(code.match(/<\/p>/i));
+```
+
+Non dovresti modificare l'elemento `h1` già esistente. Assicurati di non aver eliminato il tag di chiusura.
+
+```js
+assert($('h1').length === 1);
+```
+
+L'elemento `p` dovrebbe trovarsi sotto l'elemento `h1`.
+
+```js
+assert($('p')[0].previousElementSibling.tagName === 'H1');
+```
+
+L'elemento `p` dovrebbe avere il testo `Est. 2020`.
+
+```js
+assert(code.match(/
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f344f9c805cd193c33d829c.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f344f9c805cd193c33d829c.md
new file mode 100644
index 00000000000..adfd9aeb31f
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f344f9c805cd193c33d829c.md
@@ -0,0 +1,71 @@
+---
+id: 5f344f9c805cd193c33d829c
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Puoi aggiungere uno stile a un elemento specificandolo nell'elemento `style` e impostando una proprietà in questo modo:
+
+```css
+element {
+ property: value;
+}
+```
+
+Centra l'elemento `h1` assegnando alla proprietà `text-align` il valore `center`.
+
+# --hints--
+
+Dovresti avere un selettore `h1` nell'elemento `style`.
+
+```js
+const hasSelector = new __helpers.CSSHelp(document).getStyle('h1');
+assert(hasSelector);
+```
+
+La proprietà `text-align` dovrebbe avere il valore `center`.
+
+```js
+const hasTextAlign = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['text-align'] === 'center');
+assert(hasTextAlign);
+```
+
+Il selettore `h1` dovrebbe assegnare alla proprietà `text-align` il valore `center`.
+
+```js
+const h1TextAlign = new __helpers.CSSHelp(document).getStyle('h1')?.getPropertyValue('text-align');
+assert(h1TextAlign === 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Cafe Menu
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+
+
+
+```
+
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f356ed6199b0cdef1d2be8f.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f356ed6199b0cdef1d2be8f.md
new file mode 100644
index 00000000000..ff3ca6bf622
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f356ed6199b0cdef1d2be8f.md
@@ -0,0 +1,85 @@
+---
+id: 5f356ed6199b0cdef1d2be8f
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Finora hai usato dei selettori di tipo per gli elementi di stile. Un selettore di classe è definito da un nome con un punto direttamente davanti a esso, in questo modo:
+
+```css
+.class-name {
+ styles
+}
+```
+
+Cambia il selettore `div` esistente in un selettore di classe sostituendo `div` con una classe chiamata `menu`.
+
+# --hints--
+
+Dovresti avere un selettore di classe `.menu`.
+
+```js
+const hasMenu = new __helpers.CSSHelp(document).getStyle('.menu');
+assert(hasMenu);
+```
+
+Non dovresti avere un selettore `div`.
+
+```js
+const hasDiv = new __helpers.CSSHelp(document).getStyle('div');
+assert(!hasDiv);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+
+
+
+
+```
+
+```css
+body {
+ /*
+ background-color: burlywood;
+ */
+}
+
+h1, h2, p {
+ text-align: center;
+}
+
+--fcc-editable-region--
+div {
+ width: 80%;
+ background-color: burlywood;
+ margin-left: auto;
+ margin-right: auto;
+}
+--fcc-editable-region--
+```
+
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d28d7ad0de6470505.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d28d7ad0de6470505.md
new file mode 100644
index 00000000000..290361bd6a1
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d28d7ad0de6470505.md
@@ -0,0 +1,100 @@
+---
+id: 5f3c866d28d7ad0de6470505
+title: Step 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+I gusti e i prezzi sono gli uni sopra gli altri e centrati con i loro rispettivi elementi `p`. Sarebbe carino se il gusto fosse a sinistra e il prezzo a destra.
+
+Aggiungi il nome della classe `flavor` all'elemento `p` di `French Vanilla`.
+
+# --hints--
+
+Dovresti aggiungere la classe `flavor` all'elemento `p`.
+
+```js
+assert(code.match(/
/i));
+```
+
+Dovresti avere un solo elemento con la classe `flavor`.
+
+```js
+assert($('.flavor').length === 1);
+```
+
+La classe `flavor` dovrebbe essere nell'elemento `p` con il testo `French Vanilla`.
+
+```js
+assert($('.flavor')[0].innerText.match(/French Vanilla/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+--fcc-editable-region--
+
French Vanilla
+
3.00
+--fcc-editable-region--
+
+
+
Caramel Macchiato
+
3.75
+
+
+
Pumpkin Spice
+
3.50
+
+
+
Hazelnut
+
4.00
+
+
+
Mocha
+
4.50
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);
+}
+
+h1, h2, p {
+ text-align: center;
+}
+
+.menu {
+ width: 80%;
+ background-color: burlywood;
+ margin-left: auto;
+ margin-right: auto;
+}
+```
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e01f288a026d709587.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e01f288a026d709587.md
new file mode 100644
index 00000000000..31f13b24bdb
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e01f288a026d709587.md
@@ -0,0 +1,158 @@
+---
+id: 5f3ef6e01f288a026d709587
+title: Step 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+È possibile utilizzare un elemento `hr` per visualizzare un separatore tra sezioni con diverso contenuto.
+
+Per prima cosa, aggiungi un elemento `hr` tra il primo elemento`header`e l'elemento `main`. Nota che gli elementi `hr` sono autoconcludenti.
+
+# --hints--
+
+Dovresti aggiungere un elemento `hr`. Gli elementi `hr` sono autoconcludenti.
+
+```js
+assert(code.match(//i));
+assert(!code.match(/<\/hr>/i));
+```
+
+Non dovresti cambiare l'elemento `header` esistente.
+
+```js
+assert($('header').length === 1);
+```
+
+Non dovresti cambiare l'elemento `main` esistente.
+
+```js
+assert($('main').length === 1);
+```
+
+L'elemento `hr` dovrebbe essere tra l'elemento `header` e l'elemento `main`.
+
+```js
+assert($('hr')[0].previousElementSibling.tagName === 'HEADER');
+assert($('hr')[0].nextElementSibling.tagName === 'MAIN');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+
+--fcc-editable-region--
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+
French Vanilla
3.00
+
+
+
Caramel Macchiato
3.75
+
+
+
Pumpkin Spice
3.50
+
+
+
Hazelnut
4.00
+
+
+
Mocha
4.50
+
+
+
+
Desserts
+
+
Donut
1.50
+
+
+
Cherry Pie
2.75
+
+
+
Cheesecake
3.00
+
+
+
Cinnamon Roll
2.50
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);
+ font-family: sans-serif;
+}
+
+h1 {
+ font-size: 40px;
+}
+
+h2 {
+ font-size: 30px;
+}
+
+.established {
+ font-style: italic;
+}
+
+h1, h2, p {
+ text-align: center;
+}
+
+.menu {
+ width: 80%;
+ background-color: burlywood;
+ margin-left: auto;
+ margin-right: auto;
+ padding: 20px;
+ max-width: 500px;
+}
+
+h1, h2 {
+ font-family: Impact, serif;
+}
+
+.item p {
+ display: inline-block;
+}
+
+.flavor, .dessert {
+ text-align: left;
+ width: 75%;
+}
+
+.price {
+ text-align: right;
+ width: 25%
+}
+```
+
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e03d719d5ac4738993.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e03d719d5ac4738993.md
new file mode 100644
index 00000000000..5367b470159
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e03d719d5ac4738993.md
@@ -0,0 +1,122 @@
+---
+id: 5f3ef6e03d719d5ac4738993
+title: Step 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+La larghezza corrente del menu occuperà sempre l'80% della larghezza dell'elemento `body`. Su uno schermo molto ampio, i caffè e i dessert appaiono molto lontani dai loro prezzi.
+
+Aggiungi una proprietà `max-width` alla classe `menu` con un valore di `500px` per evitare che la sua larghezza diventi eccessiva.
+
+# --hints--
+
+Dovresti assegnare alla proprietà `max-width` il valore `500px`.
+
+```js
+const hasMaxWidth = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['max-width'] === '500px');
+assert(hasMaxWidth);
+```
+
+L'elemento `.menu` dovrebbe avere una proprietà `max-width` con il valore `500px`.
+
+```js
+const menuMaxWidth = new __helpers.CSSHelp(document).getStyle('.menu')?.getPropertyValue('max-width');
+assert(menuMaxWidth === '500px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+
French Vanilla
3.00
+
+
+
Caramel Macchiato
3.75
+
+
+
Pumpkin Spice
3.50
+
+
+
Hazelnut
4.00
+
+
+
Mocha
4.50
+
+
+
+
Desserts
+
+
Donut
1.50
+
+
+
Cherry Pie
2.75
+
+
+
Cheesecake
3.00
+
+
+
Cinnamon Roll
2.50
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);
+}
+
+h1, h2, p {
+ text-align: center;
+}
+
+--fcc-editable-region--
+.menu {
+ width: 80%;
+ background-color: burlywood;
+ margin-left: auto;
+ margin-right: auto;
+ padding: 20px;
+}
+--fcc-editable-region--
+
+.item p {
+ display: inline-block;
+}
+
+.flavor, .dessert {
+ text-align: left;
+ width: 75%;
+}
+
+.price {
+ text-align: right;
+ width: 25%
+}
+```
+
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e04559b939080db057.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e04559b939080db057.md
new file mode 100644
index 00000000000..aa0e75bc223
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e04559b939080db057.md
@@ -0,0 +1,147 @@
+---
+id: 5f3ef6e04559b939080db057
+title: Step 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Visto che tutti e 4 i lati del menu hanno la stessa spaziatura interna, prosegui ed elimina le quattro proprietà utilizzando una singola proprietà `padding` con il valore `20px`.
+
+# --hints--
+
+Dovresti rimuovere la proprietà `padding-left`.
+
+```js
+assert(!code.match(/padding-left/i));
+```
+
+Dovresti rimuovere la proprietà `padding-right`.
+
+```js
+assert(!code.match(/padding-right/i));
+```
+
+Dovresti rimuovere la proprietà `padding-top`.
+
+```js
+assert(!code.match(/padding-top/i));
+```
+
+Dovresti rimuovere la proprietà `padding-bottom`.
+
+```js
+assert(!code.match(/padding-bottom/i));
+```
+
+Dovresti assegnare alla proprietà `padding` il valore `20px`.
+
+```js
+const hasPadding = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['padding'] === '20px');
+assert(hasPadding);
+```
+
+L'elemento `.menu` dovrebbe avere una proprietà `padding` con il valore `20px`.
+
+```js
+const menuPadding = new __helpers.CSSHelp(document).getStyle('.menu')?.getPropertyValue('padding');
+assert(menuPadding === '20px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+
French Vanilla
3.00
+
+
+
Caramel Macchiato
3.75
+
+
+
Pumpkin Spice
3.50
+
+
+
Hazelnut
4.00
+
+
+
Mocha
4.50
+
+
+
+
Desserts
+
+
Donut
1.50
+
+
+
Cherry Pie
2.75
+
+
+
Cheesecake
3.00
+
+
+
Cinnamon Roll
2.50
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);
+}
+
+h1, h2, p {
+ text-align: center;
+}
+
+--fcc-editable-region--
+.menu {
+ width: 80%;
+ background-color: burlywood;
+ margin-left: auto;
+ margin-right: auto;
+ padding-left: 20px;
+ padding-right: 20px;
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
+--fcc-editable-region--
+
+.item p {
+ display: inline-block;
+}
+
+.flavor, .dessert {
+ text-align: left;
+ width: 75%;
+}
+
+.price {
+ text-align: right;
+ width: 25%
+}
+```
+
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e050279c7a4a7101d3.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e050279c7a4a7101d3.md
new file mode 100644
index 00000000000..49d3f7b8e07
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e050279c7a4a7101d3.md
@@ -0,0 +1,144 @@
+---
+id: 5f3ef6e050279c7a4a7101d3
+title: Step 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Adesso va meglio. Ora prova ad aggiungere lo stesso padding di `20px` nella parte superiore (top) e inferiore (bottom) del menu.
+
+# --hints--
+
+Non dovresti rimuovere le proprietà `padding-left` o `padding-right`.
+
+```js
+const paddingLeft = new __helpers.CSSHelp(document).getStyle('.menu')?.getPropertyValue('padding-left');
+assert(paddingLeft === '20px');
+const paddingRight = new __helpers.CSSHelp(document).getStyle('.menu')?.getPropertyValue('padding-right');
+assert(paddingRight === '20px');
+```
+
+Dovresti assegnare alla proprietà `padding-top` il valore `20px`.
+
+```js
+const hasPaddingTop = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['padding-top'] === '20px');
+assert(hasPaddingTop);
+```
+
+Dovresti assegnare alla proprietà `padding-bottom` il valore `20px`.
+
+```js
+const hasPaddingBottom = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['padding-top'] === '20px');
+assert(hasPaddingBottom);
+```
+
+L'elemento `.menu` dovrebbe avere una proprietà `padding-top` con il valore `20px`.
+
+```js
+const menuPaddingTop = new __helpers.CSSHelp(document).getStyle('.menu')?.getPropertyValue('padding-top');
+assert(menuPaddingTop === '20px');
+```
+
+L'elemento `.menu` dovrebbe avere un `padding-bottom` con il valore `20px`.
+
+```js
+const menuPaddingBottom = new __helpers.CSSHelp(document).getStyle('.menu')?.getPropertyValue('padding-bottom');
+assert(menuPaddingBottom === '20px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+
French Vanilla
3.00
+
+
+
Caramel Macchiato
3.75
+
+
+
Pumpkin Spice
3.50
+
+
+
Hazelnut
4.00
+
+
+
Mocha
4.50
+
+
+
+
Desserts
+
+
Donut
1.50
+
+
+
Cherry Pie
2.75
+
+
+
Cheesecake
3.00
+
+
+
Cinnamon Roll
2.50
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);
+}
+
+h1, h2, p {
+ text-align: center;
+}
+
+--fcc-editable-region--
+.menu {
+ width: 80%;
+ background-color: burlywood;
+ margin-left: auto;
+ margin-right: auto;
+ padding-left: 20px;
+ padding-right: 20px;
+}
+--fcc-editable-region--
+
+.item p {
+ display: inline-block;
+}
+
+.flavor, .dessert {
+ text-align: left;
+ width: 75%;
+}
+
+.price {
+ text-align: right;
+ width: 25%
+}
+```
+
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e05473f91f948724ab.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e05473f91f948724ab.md
new file mode 100644
index 00000000000..5dbb79e0247
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e05473f91f948724ab.md
@@ -0,0 +1,121 @@
+---
+id: 5f3ef6e05473f91f948724ab
+title: Step 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Puoi cambiare la proprietà `font-family`, per rendere il testo diverso dal carattere predefinito del browser. In ogni browser sono disponibili alcuni caratteri comuni.
+
+Cambia tutto il testo nell'elemento `body` aggiungendo una proprietà `font-family` con il valore `sans-serif`. Questo è un carattere abbastanza comune ed è molto leggibile.
+
+# --hints--
+
+Dovresti assegnare alla proprietà `font-family` il valore `sans-serif`.
+
+```js
+const hasFontFamily = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['font-family'] === 'sans-serif');
+```
+
+L'elemento `body` dovrebbe avere un `font-family` con il valore `sans-serif`.
+
+```js
+const bodyFontFamily = new __helpers.CSSHelp(document).getStyle('body')?.getPropertyValue('font-family');
+assert(bodyFontFamily === 'sans-serif');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+
French Vanilla
3.00
+
+
+
Caramel Macchiato
3.75
+
+
+
Pumpkin Spice
3.50
+
+
+
Hazelnut
4.00
+
+
+
Mocha
4.50
+
+
+
+
Desserts
+
+
Donut
1.50
+
+
+
Cherry Pie
2.75
+
+
+
Cheesecake
3.00
+
+
+
Cinnamon Roll
2.50
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+body {
+ background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);
+}
+--fcc-editable-region--
+
+h1, h2, p {
+ text-align: center;
+}
+
+.menu {
+ width: 80%;
+ background-color: burlywood;
+ margin-left: auto;
+ margin-right: auto;
+ padding: 20px;
+ max-width: 500px;
+}
+
+.item p {
+ display: inline-block;
+}
+
+.flavor, .dessert {
+ text-align: left;
+ width: 75%;
+}
+
+.price {
+ text-align: right;
+ width: 25%
+}
+```
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e056bdde6ae6892ba2.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e056bdde6ae6892ba2.md
new file mode 100644
index 00000000000..612986b9408
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e056bdde6ae6892ba2.md
@@ -0,0 +1,138 @@
+---
+id: 5f3ef6e056bdde6ae6892ba2
+title: Step 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+È un po' noioso che tutto il testo abbia la stessa proprietà `font-family`. Puoi ancora avere la maggior parte del testo `sans-serif` e differenziare solo gli elementi `h1` e `h2` utilizzando un altro selettore.
+
+Cambia il carattere degli elementi `h1` e `h2` in modo che solo il testo di questi elementi utilizzi il carattere `Impact`.
+
+# --hints--
+
+Dovresti usare un selettore `h1, h2`.
+
+```js
+const h1h2Selector = new __helpers.CSSHelp(document).getStyle('h1, h2');
+assert(h1h2Selector);
+```
+
+Dovresti assegnare alla proprietà `font-family` il valore `Impact`.
+
+```js
+const hasFontFamily = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['font-family'] === 'Impact');
+assert(hasFontFamily);
+```
+
+L'elemento `h1` dovrebbe avere una proprietà `font-family` con il valore `Impact`.
+
+```js
+assert($('h1').css('font-family').match(/impact/i));
+```
+
+L'elemento `h2` dovrebbe avere una proprietà `font-family` con il valore `Impact`.
+
+```js
+assert($('h2').css('font-family').match(/impact/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+
+
+
CAMPER CAFE
+
Est. 2020
+
+
+
+
Coffee
+
+
French Vanilla
3.00
+
+
+
Caramel Macchiato
3.75
+
+
+
Pumpkin Spice
3.50
+
+
+
Hazelnut
4.00
+
+
+
Mocha
4.50
+
+
+
+
Desserts
+
+
Donut
1.50
+
+
+
Cherry Pie
2.75
+
+
+
Cheesecake
3.00
+
+
+
Cinnamon Roll
2.50
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);
+ font-family: sans-serif;
+}
+
+h1, h2, p {
+ text-align: center;
+}
+
+.menu {
+ width: 80%;
+ background-color: burlywood;
+ margin-left: auto;
+ margin-right: auto;
+ padding: 20px;
+ max-width: 500px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.item p {
+ display: inline-block;
+}
+
+.flavor, .dessert {
+ text-align: left;
+ width: 75%;
+}
+
+.price {
+ text-align: right;
+ width: 25%
+}
+```
+
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e06d34faac0447fc44.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e06d34faac0447fc44.md
new file mode 100644
index 00000000000..f1050c694a3
--- /dev/null
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e06d34faac0447fc44.md
@@ -0,0 +1,135 @@
+---
+id: 5f3ef6e06d34faac0447fc44
+title: Step 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Crea un selettore di classe `established` e assegna alla proprietà `font-style` il valore `italic` per far sì che il testo `Est. 2020` sia in corsivo.
+
+# --hints--
+
+Dovresti avere un selettore `.established`.
+
+```js
+const hasEstablished = new __helpers.CSSHelp(document).getStyle('.established');
+assert(hasEstablished);
+```
+
+Dovresti assegnare alla proprietà `font-style` il valore `italic`.
+
+```js
+const hasFontStyle = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['font-style'] === 'italic');
+assert(hasFontStyle);
+```
+
+Il selettore `.established` dovrebbe assegnare alla proprietà `font-style` il valore `italic`.
+
+```js
+const establishedFontStyle = new __helpers.CSSHelp(document).getStyle('.established')?.getPropertyValue('font-style');
+assert(establishedFontStyle === 'italic');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Cafe Menu
+
+
+
+